Как избежать дублирования данных при 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')]) и все вывелось как надо
Продвижение своими сайтами как стратегия роста и независимости