Красноречивый запрос для выбора значений от многих ко многим, используя laravel - PullRequest
0 голосов
/ 05 сентября 2018

Я работаю над проектом, в котором между двумя таблицами существует отношение многие ко многим: первая таблица - это таблица городов, а вторая - таблица контрольных точек.

В городе много контрольно-пропускных пунктов, и контрольно-пропускные пункты могут принадлежать многим городам.

До сих пор я создал новую таблицу с именем checkpoint_city, содержащую checkpoint_id и city_id ..

Таким образом, у города A есть точки x, Y, но у города B есть X, Z

Теперь я хочу выбрать единственные контрольные точки, которые принадлежат городу A и B вместе, то есть X ..

Мой код до сих пор:

 $checkpoints = CheckPoint::select('*')->where('type', 'n')->where('checkpoints.active', 1);

        if(! empty($request->city_ids)) {
            $cities=explode(",",$request->city_ids);

            $checkpoints = $checkpoints->crossJoin('checkpoint_city','checkpoints.id','=','checkpoint_city.checkpoint');
            $checkpoints = $checkpoints->crossJoin('cities','cities.id','=','checkpoint_city.city')->whereIn("cities.id",$cities);

            for($i=0; $i<count($cities); $i++){
                $checkpoints = $checkpoints->where("cities.id",$cities[$i]);
            }

           $checkpoints = $checkpoints->groupBy('checkpoints.id');
        }

Но это не сработало для меня, любая помощь?

1 Ответ

0 голосов
/ 05 сентября 2018

Вы можете использовать laravel whereHas, чьи отношения проверки существуют с дополнительным условием

$checkpoints = CheckPoint::where('type', 'n')
                    ->where('active', 1)
                    ->whereHas('cites', function($query){
                        $query->where('name','A');
                    })->whereHas('cites', function($query){
                        $query->where('name','B');
                    })->get();

Предполагая, что у вас есть belongsToMany отношение с именем cites в вашей CheckPoint модели, а City имеет name поле

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