为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Eloquent 的条件 wherehas

Laravel Eloquent 的条件 wherehas

PHP
尚方宝剑之说 2021-12-03 15:29:22
我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);
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

您将所有 where 语句括在括号中。我认为您想要做的是将查询的第一部分从 where 子句中拉出,以便您可以轻松地将该whereHas部分括在括号中。


// Initialise the model

$query = new Master;


// Start building the query

if ($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);


查看完整回答
反对 回复 2021-12-03
?
开满天机

TA贡献1786条经验 获得超13个赞

您可以参考此链接创建合并关系


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')


查看完整回答
反对 回复 2021-12-03
?
DIEA

TA贡献1820条经验 获得超2个赞

使用更近的位置并在内部设置条件可能会正常工作


$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] );

    });

});


查看完整回答
反对 回复 2021-12-03
  • 3 回答
  • 0 关注
  • 302 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信