laravel 的where方法里为什么不支持 between
目前用的laravel9 还是不支持
where(field,'between',[1,2])
这种方式吗,在做页面的搜索查询时,如果使用查询构造器的方式取查的话需要写好多if做判断然后链接查询语句,请问有其他更好的办法吗
我的代码类似于这样
$where = [];
$where['application_name'] = $this->request->input('application_name', '');
$where['username'] = $this->request->input('username', '');
$where['url'] = $this->request->input('url', '');
$where['ip'] = $this->request->input('ip', '');
$where['type'] = $this->request->input('type', '');
$created_at_start = $this->request->input('created_at_start', '');
$created_at_end = $this->request->input('created_at_end', '');
$where['created_at'] = ['between', [$created_at_start, $created_at_end]];
$order = $this->request->input('order', '');
$sort = $this->request->input('sort', '');
$field = ['log' => ['id', 'application_name', 'username', 'url', 'ip', 'type', 'created_at']];
$order_by = ['field' => ($sort && $order) ? $sort : 'id', 'sort' => $order];
$res = \Modules\Admin\Http\Service\LogService::list($where, $field, $order_by, $limit, $page);
其实我这代码是后台生成的,不太想用其他包取解决这个问题,目前是用的笨方法解决的,代码生成时不用考虑太多,ide也有代码提示,方便后面手动更改
/**
* @param $model
* @param $data
* @return \Illuminate\Database\Eloquent\Builder
*/
function formatWhere($model, $data)
{
foreach ($data as $k => $v) {
if (is_array($v) && ((is_array($v[1]) && $v[1][0] !== null) || (!is_array($v[1]) && $v[1] !== null))) {
$field = strtolower($v[0]);
switch ($field) {
case 'like':
$model = $model->where($k, 'sounds like', '%' . $v[1] . '%');
break;
case 'between':
$model = $model->whereBetween($k, $v[1]);
break;
case 'not between':
$model = $model->whereNotBetween($k, $v[1]);
break;
case 'in':
$model = $model->whereIn($k, $v[1]);
break;
case 'not in':
$model = $model->whereNotIn($k, $v[1]);
break;
}
} else {
if ($v !== null) {
$model = $model->where($k, '=', $v);
}
}
}
return $model;
}
public static function indexList($where, $field, $order_by, $limit, $page)
{
try {
$res = formatWhere(new \Modules\Admin\Entities\Log,$where)->orderBy($order_by['field'], $order_by['sort'])
->paginate($perPage = $limit, $field['log'], 'page', $page)->toArray();
return ['rows' => $res['data'], 'total' => $res['total']];
} catch (\Exception $e) {
self::validationException($e->getMessage());
}
}
whereBetween 有这个方法
你需要这个 github.com/Tucker-Eric/EloquentFil...
Eloquent 本身就有个 whereBetween
不支持的,包括
in
查询也是不支持,我想你大概是遇到这样的情况:试试我写的扩展 github.com/chastephp/laravel-where...
看到这样的代码,只能说以后你没有朋友
我总喜欢写whereRaw()怎么办 :joy:
看了下
whereBetween
的源码,试试addBinding
??