Я пытаюсь получить уникальные строки из базы данных MySQL из PHP и Laravel.
В моей БД я:
Email Errors Status a@aa error1 pending a@aa error2 pending b@bb error1 pending b@bb error1 pending
В моей голове было бы решение:
$transactions->unique('email', 'errors', 'status' )
Но это возвращает:
Email Errors Status a@aa error1 pending b@bb error1 pending
И если я попробую:
$transactions->unique(['email', 'errors', 'status'] )
Это еще хуже:
Email Errors Status a@aa error1 pending
Мое идеальное решение было бы таким, поэтому я могу видеть разные ошибки от каждого пользователя:
Email Errors Status a@aa error1 pending a@aa error2 pending b@bb error1 pending
Это означает уникальность, основанную на нескольких столбцах.
Я искал везде без успеха, надеюсь кто-то может помочь 🙂
Ты можешь…
1) либо предоставить свою собственную функцию как unique
предикат:
$transactions->unique(function ($item) { return $item['email'].'/'.$item['errors'].'/'.$item['status']; });
… предполагая, что символ /
никогда не используется ни в одном из полей.
2) или сделать такую группировку на уровне запросов, используя метод groupBy
:
$DB::table('transactions')->select('email', 'errors', 'status') ->groupBy('email') ->groupBy('errors') ->groupBy('status') ->get();
Я лучше поеду с последним.