Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有条件的,有条件的_Php_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 有条件的,有条件的

Php 有条件的,有条件的,php,mysql,laravel,laravel-5,eloquent,Php,Mysql,Laravel,Laravel 5,Eloquent,我在两个表one和two中有一个类似的(area)值,这两个表与主表master相关。一次,master表将只包含一个关系中的数据,而另一个关系将为null 有了这个架构,我有了一个搜索页面,用户可以在其中搜索与这些表相关的任何值,搜索字段以和条件放置 这里,如果用户为区域输入一些值,我需要检查任何一个表(one或two)中存在的区域值,而不破坏和条件。尝试了以下代码,但它违反了和规则,正在考虑或。有什么建议可以解决吗 $result = Master::where(function ($qu

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

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

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

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

您正在将所有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);

您正在将所有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);

您可以创建合并关系



并使用whereHas('mergedOneAndTwo')您可以创建一个合并关系



并使用whereHas('mergedOneAndTwo')

使用更接近的where并在内部设置条件可能会很好

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

在何处使用闭合器并在内部设置条件可能会很好

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

我真的不明白你打破
@IGP的意思,所有搜索字段都应该用
分开。但是这里由于
或where has
,条件是在不考虑以前的条件的情况下从该字段中获取所有内容。哦!只需放置另一个where闭包,其中封装了where和has。我不太明白你在破坏
@IGP时的意思。所有搜索字段都应该用
分开。但是这里由于
或where has
,条件是在不考虑以前的条件的情况下从该字段中获取所有内容。哦!只需放置另一个where闭包,封装whereHas和whereHas