Laravel Eloquent Query — Как вернуть уникальные значения, используя DISTINCT

Я новичок в Laravel и Eloquent и пытаюсь получить уникальные записи из 3 таблиц, а именно: шкафы, item_types и сводный cupboard_items. Существует также 4-я таблица местоположений.

Построил рабочий запрос в MySQL, как показано ниже (успешно протестирован на MySQL Workbench). Пробовал использовать DB :: raw (») и DB :: Statement (»), но моя IDE выдавала предупреждение, что «Нет источников данных, настроенных для запуска этого SQL и предоставления расширенной помощи по коду» и использование DB :: raw вернуло пустой объект, в то время как инструкция DB :: вернула ‘true’.

SELECT cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates FROM cupboards INNER JOIN
(SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items) AS dist
ON cupboards.cupboard_id = dist.cupboard_id
INNER JOIN item_types ON dist.item_type_id = item_types.item_type_id
INNER JOIN locations ON locations.location_id = cupboards.location_id;

Не уверен, что мой синтаксис неправильный, но впоследствии я также попытался создать запрос Eloquent

$result = DB::table('cupboards')
->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates'))
->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items'))
->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id')
->join('locations', 'locations.location_id', '=', 'cupboards.location_id')
->get();

Но, очевидно, у меня не может быть DISTINCT в моем запросе DB :: raw, и я не уверен, что мое соединение выполнено правильно. Любые советы о том, как действовать дальше, очень ценятся !!! Спасибо!

0

Решение

Я думаю, что вам не нужен этот сложный запрос, я надеюсь, что вы хотите получить значения из модели шкафа, с местоположением. Определите эти отношения в классе шкафов,

Cupboard {

public function units()
{
return $this->belongsToMany('cupboardItem', 'cupboard_items', 'cupboard_id', 'item_type_id');
}

public function location()
{
return $this->hasOne('location', 'location_id', 'location_id');
}

}

Тогда сделай,

Cupboard::get();

Если вы получите дубликаты записей,

Cupboard::select('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates')->distinct()->get();
0

Другие решения

заменить запрос ниже:

    $result = DB::table('cupboards')
->select(DB::raw('cupboards.cupboard_id, cupboards.name, cupboards.capacity, dist.item_type_id, item_types.name, locations.coordinates'))
->join(DB::raw('SELECT DISTINCT cupboard_items.item_type_id, cupboard_id FROM cupboard_items'))
->join('item_types', 'dist.item_type_id', '=', 'cupboard.item_type_id')
->join('locations', 'locations.location_id', '=', 'cupboards.location_id')
->distinct()
->get();
0

По вопросам рекламы [email protected]