我想用laravel ORM创建一个动态查询。在我的例子中:
$query = Task::orderBy('customer_family_name');
if (array_key_exists('date', $request->filter)) {
if($request->filter['date'] != null) {
$query = $query->whereDate(....);
}
}
..... more filters
if (array_key_exists('search', $request->filter)) {
if(strlen($request->filter['search']) > 1) {
$searchText = $request->filter['search'];
$query = $query->where('customer_family_name', $searchText.'%');
}
}
}
$Tasks = $query->get();
但它没有按预期工作。我认为laravel将推送所有元素,所以必须满足所有where子句。
但搜索姓氏不起作用。我有什么不对吗?我怎样才能将它正确组合起来?有没有办法用orm显示SQL查询?
编辑:确定发现这是另一个问题,我的查询如下:
"select * from [tasks] where [state_id] in (?, ?, ?, ?, ?, ?) and [customer_family_name] = ? and [regulator_user_id] in (?, ?, ?) or [regulator_user_id] is null order by [customer_family_name] asc"
我的过滤器:
if (array_key_exists('regulator', $request->filter)) {
$regulator_array = explode(",", $request->filter['regulator']);
if(is_array($regulator_array)) {
$query->whereIn('regulator_user_id', $regulator_array)->orWhereNull('regulator_user_id');
}
}
看起来orWhereNull是问题所在。我想返回
的每一行regulator_user_id在该数组中 AND所有其中regulator_user_id IS NULL
但所有其他过滤器应该按预期工作。
我该怎么做?
答案 0 :(得分:0)
您不应该重新保存到$query
变量:
$query = $query->whereDate(....);
将其更改为此(以及其他过滤器):
$query->whereDate(....);
你的最后命令:
$Tasks = $query->get();
然后会根据添加到$query
对象的额外查询返回正确的数据。
答案 1 :(得分:0)
正如Jhonny Walker所提到的,你不应该在每次查询时都保存,而是每次使用$ query->。
$ Tasks = $ query-> get()之前的一行;
尝试调试使用以下命令生成的mysql命令。
dd($query->toSql());
如果要粘贴结果以帮助您使用where子句。
答案 2 :(得分:0)
Ok ill找到了正确的解决方案:
我需要自己的查询功能来将Where与orNhereNull结合起来:
if(is_array($regulator_array)) {
$query = $query->where(function($query) use($regulator_array) {
$query->whereIn('regulator_user_id', $regulator_array)
->orWhereNull('regulator_user_id');
});
}
现在查询工作正常。谢谢你的所有答案。
答案 3 :(得分:0)
或者你可以在()时使用这种甜言蜜语的方法,所以你不必使用if语句并打破方法链,而是你得到了流畅的查询构建。 Eloquent when()