Laravel Eloquent 的条件 wherehas

我area在两个表中有一个相似的 ( ) 值one,two并且这两个表与主表有关系master。一次,该master表将仅在一个关系中包含数据,而另一个将是null。


使用这种架构,我有一个搜索页面,用户可以在其中搜索与这些表相关的任何值,并且搜索字段放置AND有条件。


在这里,如果用户输入一些值,area我需要检查任何一个表 (one或two) 中存在的面积值,而不会破坏AND条件。尝试了下面的代码,但它违反了AND规则并考虑了OR. 有什么建议可以解决吗?


$result =  Master::where(function ($query) use ($request) {

    if ($request->filter == true) {

        $query->where('user_id', Auth::user()->id);

    }

    // other conditions here

    if (!empty($request->area_from) && !empty($request->area_to)) {

        $query->whereHas('one', function ($query) use ($request) {

            $query->whereBetween('area', [$request->area_from, $request->area_to]);

        });

        $query->orWhereHas('two', function ($query) use ($request) {

            $query->whereBetween('area', [$request->area_from, $request->area_to]);

        });

    }

    // other conditions here


})->with(['one', 'two'])->paginate($request->item);


尚方宝剑之说
浏览 303回答 3
3回答

绝地无双

您将所有 where 语句括在括号中。我认为您想要做的是将查询的第一部分从 where 子句中拉出,以便您可以轻松地将该whereHas部分括在括号中。// Initialise the model$query = new Master;// Start building the queryif ($request->filter == true) {    $query->where('user_id', Auth::user()->id);}if (!empty($request->area_from) && !empty($request->area_to)) {    // Wrap these in brackets so we don't interfare with the previous where    $query->where(function($query2) use ($request) {        $query2->whereHas('one', function ($query3) use ($request) {            $query3->whereBetween('area', [$request->area_from, $request->area_to]);        });        $query2->orWhereHas('two', function ($query3) use ($request) {            $query3->whereBetween('area', [$request->area_from, $request->area_to]);        });    }}$query->with(['one', 'two'])->paginate($request->item);

开满天机

您可以参考此链接创建合并关系public function mergedOneAndTwo($value){    // There two calls return collections    // as defined in relations.    $onedata= $this->one;    $twodata= $this->two;    // Merge collections and return single collection.    return $onedata->merge($twodata);}并使用 whereHas('mergedOneAndTwo')

DIEA

使用更近的位置并在内部设置条件可能会正常工作$master = Master::with('one')->with('two');$result = $master->where(function($subQuery){       $subQuery->whereHas('one', function ( $query ) {        $query->whereBetween('area', [$request->area_from, $request->area_to] ); //assuming  $request->area_from, $request->area_to is range of value    })    ->orWhereHas('two', function ( $query ) {        $query->whereBetween('area', [$request->area_from, $request->area_to] );    });});
打开App,查看更多内容
随时随地看视频慕课网APP