总结写前面:
使用ORM,用链式查询时,在Laravel中,构造多条件where,或者在链式中使用闭包函数,在生成的SQL中表现为一个括号,
就像这样:
select * frome role ($where)and ($orWhere) and $where
所以在使用orWhere时,不能出现如下写法,否则最终的效果可能会和你预期的不一样。
$query = Role::where($where);
$query->whereNull('deleted_at');
$query->where('deleted_at','>',0);
$query->orWhere(function ($query)use($inputStartTime,$inputEndTime,$inputTitle){
$query->where("type","=",0);
$query->where("updated_at",">=",$inputStartTime);
$query->where("updated_at","<",$inputEndTime);
$query->where('title', 'like', '%' . $inputTitle . '%');
});
具体原因:
//where的条件
if ($request->has('start_time')) {
$where[] = ['updated_at', '>=', $inputStartTime];
}
if ($request->has('end_time')) {
$where[] = ['updated_at', '<', $inputEndTime];
}
if ($hasTitle) {
$where[] = ['title', 'like', '%' . $inputTitle . '%'];
}
if ($hasProjectId) {
$where[] = ['project_id', '=', $inputProjectId];
} else {
$where[] = ['type', '=', 0];
}
//使用的ORM模型
$query = Role::where($where);
$query->whereNull('deleted_at');
$query->orWhere(function ($query)use($inputStartTime,$inputEndTime,$inputTitle){
$query->where("type","=",0);
$query->where("updated_at",">=",$inputStartTime);
$query->where("updated_at","<",$inputEndTime);
$query->where('title', 'like', '%' . $inputTitle . '%');
});
//最终生成的SQL
//当我们在链式中加多
$query->where('deleted_at','>',0);
//最终生成的SQL,可以看到$query->where('deleted_at','>',0),在SQL中被当成了一个独立的and条件,而非在$where中。
select * from `system_role` where (`updated_at` >= ? and `updated_at` < ? and `title` like ? and `project_id` = ?) and `deleted_at` is null and `deleted_at` > ? or (`type` = ? and `updated_at` >= ? and `updated_at` < ? and `title` like ?) order by `updated_at` desc, `id` desc
划重点:$query->where('deleted_at','>',0)等于and `deleted_at` is null
如果想深入了解的话,可以看下Laravel是如何实现ORM的