Показывать только видимые элементы и группы, в которых есть элементы - PullRequest
0 голосов
/ 05 июля 2018

У меня есть эти два запроса, но я получаю половину правильного результата в каждом.

У меня есть group таблицы и item таблицы.
Вы можете установить item записей невидимыми.
Вы можете установить group записей невидимыми.
У вас также есть случаи, когда у group записей нет связанных item записей (пустая группа).

Я хочу выбрать все group записи, которые являются видимыми и имеют связанные item записи.

Возвращает пустые групповые записи (группы без связанных элементов)

            return  $this->model->with( [ 'items' => function($query){
                        $query->where('invisible','=',FALSE)->orderBy('description', 'ASC');
                    }])
                ->where("hos_id",$hos_id)
                ->where('invisible','=',FALSE)
                ->orderBy('description', 'asc')
                ->get();

Этот возвращает только группы с записями элементов, но с hidden элементами также

            return $this->model->with('items')
                ->whereHas('items',function ($query){
                    $query->where('invisible','=',FALSE)->orderBy('description', 'ASC');
                })
                ->where("hos_id",$hos_id)
                ->where('invisible','=',FALSE)
                ->orderBy('description', 'asc')
                ->get();

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Используйте

return $this->model->with(['items' => function ($query){
                $query->where('invisible','=',FALSE)->orderBy('description', 'ASC');
            }])
            ->whereHas('items',function ($query){
                $query->where('invisible','=',FALSE)->orderBy('description', 'ASC');
            })
            ->where("hos_id",$hos_id)
            ->where('invisible','=',FALSE)
            ->orderBy('description', 'asc')
            ->get();
0 голосов
/ 05 июля 2018

Не уверен, что я понял 100%, поэтому я написал следующее настолько просто, насколько это возможно, и вы можете разобрать его, если оно не работает.

Соединение left должно разрешать группы без элементов (пустая группа)

Group::leftJoin('items', function ($join) {
        $join->on('groups.id', '=', 'items.group_id')
             ->where('invisible', false);
    })
    ->where('invisible', false)
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...