雄辩的查询,使用laravel

时间:2018-09-05 07:28:25

标签: laravel join eloquent

我正在一个项目中,该项目在2个表之间具有多对多关系,第一个表是“城市”表,第二个表是“检查点”表。

该城市有许多检查站,并且这些检查站可能属于许多城市。

到目前为止,我已经创建了一个名为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 :(得分:1)

您可以使用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的{​​{1}}关系,并且CheckPointCity字段