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

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

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

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, и я не уверен, правильно ли выполнено мое соединение. Любые советы о том, как действовать отсюда, очень ценятся!!! Спасибо!


person jlyh    schedule 12.01.2017    source источник
comment
Найдите этот ответ полезным stackoverflow.com/a/29728129/3918473   -  person Gayan    schedule 12.01.2017


Ответы (2)


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

    $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();
person Sujal Patel    schedule 12.01.2017
comment
dist — это ссылка на внутренний оператор SELECT, но как бы вы указали это в запросе laravel? - person jlyh; 13.01.2017

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

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();
person Vineesh    schedule 12.01.2017
comment
Я думаю, это хороший совет в общем направлении - иметь толстую Модель и худой Контроллер. Но я очень не знаком с синтаксисом вызова методов модели, во всяком случае, я думаю, мне просто придется стиснуть зубы и изучить, как реализовать эти вещи. Спасибо, в любом случае. - person jlyh; 13.01.2017