laravel unique () не работает с разбиением на страницы - PullRequest
0 голосов
/ 16 января 2020

Я столкнулся с проблемой в laravel 5.7.28, я пытаюсь получить записи со всеми моими полями и разбить их на страницы, к сожалению, я получил ошибку в своем коде, которая приводила к регистрации пользователей с повторяющимся номером телефона (пользователь регистрировал себя более одного раза, и, конечно, я исправляю ошибку), сейчас я сталкиваюсь со сценарием, который я хочу получить (не дублировать) отдельных пользователей на их телефоне и разбить их на страницы. Вот желаемый сценарий:

$users = User::distinct('phone')
->doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40);

возвращает всех пользователей (с повторяющимся номером телефона), кажется, отдельная функция не затронута, поэтому я попробовал уникальную функцию:

$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40)->unique('phone');

она работает (для получить не дубликат), но нарушить нумерацию страниц

и для

$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()
->unique('phone')
->paginate(40);

я получил ошибку для неопределенной функции на сборщике, означает, что она работает на коллекциях, также я попробовал groupBy (поиск по всей сети для решения), это делает меня смущенным до тех пор, пока я использую его

User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()->groupBy('phone')
->paginate(40);

я получил SELECT list is not in GROUP BY clause, это означает, что в каждой фразе в моем утверждении выбора (сейчас все ('*')) я следует использовать его в моей группе? я имею в виду, мне нужны все столбцы, как я могу иметь все эти столбцы в предложении groupBy? что это значит между прочим?

, ошибка говорит: это несовместимо с sql_mode = only_full_group_by . она заставляет это случиться? как я могу это исправить? 1) извините за мой английский sh 2) спасибо за чтение всего этого 3) приятно ответить и помочь мне

1 Ответ

0 голосов
/ 16 января 2020

Проблема 1: Используйте отдельный

Для метода distinct() передача параметров не поддерживается, поэтому distinct(phone) не будет работать.

Вместо этого можно использовать ->select('phone')->distinct(). Однако выбран уникальный столбец поддержки.

Проблема 2: Использовать группировку по

Поэтому, если вы хотите выбрать все столбцы и один уникальный столбец , вы можете использовать group by.

А потому что вы используете mysql 5.7+.

Режимы ONLY_FULL_GROUP_BY и STRICT_TRANS_TABLES были добавлены в MySQL 5.7.5.

Таким образом, если вы выберете все столбцы и сгруппируете один столбец, вы получите ошибку only_full_group_by.

Существует два варианта решения этой проблемы.

Solution1:

Использование ANY_VALUE()

User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()
->selectRaw('phone, ANY_VALUE(id) AS id, ANY_VALUE(username) AS username, ...')
->groupBy('phone')
->paginate(40);

Solution2:

В config / database. php configuration, установите строгий режим на false (это не очень безопасно):

'mysql' => [
   'driver' => 'mysql',
   ...
   'strict' => false,
],
...