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());
        }
    }
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 13

whereBetween 有这个方法

1年前 评论

Eloquent 本身就有个 whereBetween

$model->query()->whereBetween('field', ['start', 'end']);
1年前 评论
AMA32 (楼主) 1年前
MArtian (作者) 1年前

不支持的,包括in查询也是不支持,我想你大概是遇到这样的情况:

// 错误示例
$where = [];
$where[] = ['name', 'jack'];
if (!empty($ageMin) && !empty($ageMax)) {
    $where[] = ['age', 'between', [$ageMin, $ageMax]];
}
if ($citys) {
    $where[] = ['city', 'in', $citys];
}
$result = DB::table('table1')->where($where)->get();

// 替代方案
$query = DB::table('table1');
$query->where('name', 'jack');
if (!empty($ageMin) && !empty($ageMax)) {
    $query->whereBetween('age', [$ageMin, $ageMax]);
}
if ($citys) {
    $query->whereIn('city', $citys);
}
$result = $query->get();
1年前 评论
$params = $request->only([
            "name","time","status"
        ]);
        $wheres = [];
        foreach ($params as $key => $value) {
            if ($value){
                if (in_array($key,["status"])){
                    $wheres[] = [$key,$value];
                }elseif (in_array($key,["time"])){
                    $value = explode(",",$value);
                    $wheres[] = [function($query)use($value){
                        $query->whereBetween("time",$value[0],$value[1]);
                    }];
                }else{
                    $wheres[] = [$key,"like","%".$value."%"];
                }
            }
        }
        $model = new Model();
        foreach ($wheres as $where){
            $model = $model->where(...$where);
        }
        $model->paginate(10);
1年前 评论

看到这样的代码,只能说以后你没有朋友

1年前 评论
唐章明 1年前
AMA32 (楼主) 1年前

我总喜欢写whereRaw()怎么办 :joy:

1年前 评论
秦晓武

看了下whereBetween的源码,试试addBinding??

public function whereBetween($column, array $values, $boolean = 'and', $not = false)
    {
        $type = 'between';

        $this->wheres[] = compact('type', 'column', 'values', 'boolean', 'not');

        $this->addBinding(array_slice($this->cleanBindings(Arr::flatten($values)), 0, 2), 'where');

        return $this;
    }
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!