【发布时间】:2016-12-28 18:44:16
【问题描述】:
我想用 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 元素,因此必须满足所有 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 在该数组中 以及所有监管者用户 ID 为空的地方
但所有其他过滤器都应按预期工作。
我该怎么做?
【问题讨论】:
-
$Tasks = $query->toSql();将向您显示 sql 代码。通过barryvdh更好地使用调试栏。另外,试试$query = $query->where('customer_family_name', 'LIKE', $searchText.'%');