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