Laravel выбрать все строки, если идентификатор существует в другой таблице, а в столбце указаны c значения для этой таблицы - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть 4 таблицы:

уведомления (id, title, des c, is_published)

notices_to_districts (id, note_id, district_id)

notices_to_employees (id, note_id, user_id)

notices_to_establishments (id, note_id, creation_id)

I хотите получить все уникальные уведомления, если

notices_to_districts имеет указанный c district_id, или

notices_to_employees имеет указанный c user_id или

notices_to_establishments имеет спецификацию c creation_id

Я пытаюсь -

$notices = Notice::join('notices_to_districts', 'notices_to_districts.notice_id', '=', 'notices.id')
            ->join('notices_to_establishments', 'notices_to_establishments.notice_id', '=', 'notices.id')
            ->join('notices_to_employees', 'notices_to_employees.notice_id', '=', 'notices.id')
            ->where('district_id', '=', $user_district_id)
            ->orWhere('establishment_id', '=', $user_establishment_id)
            ->orWhere('user_id', '=', $user_id)
            ->where('is_published', '=', 1)->get();

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020
     I solved it - 


$notice_ids_of_district = Notices_to_district::select('notice_id')->where('district_id', '=', $user_district_id)->get();
            $notice_ids_of_establishment = Notices_to_establishment::select('notice_id')->where('establishment_id', '=', $user_establishment_id)->get();
            $notice_ids_of_employee = Notices_to_employee::select('notice_id')->where('user_id', '=', $user_id)->get();

            $notices = Notice::whereIn('id', $notice_ids_of_district)
            ->orWhereIn('id', $notice_ids_of_establishment)
            ->orWhereIn('id', $notice_ids_of_employee)
            ->get(); 
0 голосов
/ 14 апреля 2020

Вы должны использовать Группировка параметров закрытия , иначе ваш "orWhere" не будет работать, когда вы будете sh.

$notices = Notice::join('notices_to_districts', 'notices_to_districts.notice_id', '=', 'notices.id')
            ->join('notices_to_establishments', 'notices_to_establishments.notice_id', '=', 'notices.id')
            ->join('notices_to_employees', 'notices_to_employees.notice_id', '=', 'notices.id')
            ->where('district_id', '=', $user_district_id)
            ->where('is_published', '=', 1)            
            ->where(
                function ($query) use ($user_establishment_id, $user_id) {
                        $query->orWhere('establishment_id', '=', $user_establishment_id)
                            ->orWhere('user_id', '=', $user_id);
                }
            )
            ->get();

Как и в этом примере, SQL будет иметь правильный парентез вокруг вашего предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...