Как избежать дублирования данных при join
в laravel
?
Пример:
2 таблицы: в одной пользователи, в другой картинки.
У каждого пользователя может быть несколько картинок в таблице картинок.
Как в запросе избежать дублирования при join
(в запросе выводит все картинки для пользователя дублирую пользователя) и вывести для каждого пользователя одну картинку?
Код:
$data = DB::table('users')
->leftJoin('users_image', function($join) {
$join->on('users_image.name', '=', 'users.name');
})
->select('*')
->paginate(5);
Если Вам необходимо выбрать уникальные строки, то есть выборка только не повторяющихся сочетаний "пользователь => картинка", то можно добавить условие distinct():
$data = DB::table('users')
->leftJoin('users_image', function($join) {
$join->on('users_image.name', '=', 'users.name');
})
->distinct()
->paginate(5);
В Вашем случае, select('*')
не нужно, потому что по умолчанию выбираются все записи. Для корректного срабатывания условия ditinct()
необходимо указать конкретные поля для выборки, например ->select('users.name','users_image.name')
, в таком случае выберутся нужные поля и на них наложится distinct()
, то есть возьмутся уникальные значения.
Если же Вам нужно выбрать только одну картинку для каждого пользователя, то необходимо добавить дополнительное условие в запросе:
$data = DB::table('users')
->leftJoin('users_image', function($join) {
$join->on('users_image.name', '=', 'users.name');
})
->distinct()
->whereIn('users_image.id', DB::raw('select max(id) from users_image group by name'))
->paginate(5);
Исправил запрос на ->whereIn('image.ID', [DB::raw('select max(ID) from image group by image.Lot')]) и все вывелось как надо
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу проверять свои сайты с админ сайта на работуКак это лучше организовать? Думаю сделать специальные ссылки для каждого и получать с них...