Laravel查询问题:如何根据请求变量动态追加查询条件?
问题分析与解决办法
嗨,你遇到的问题其实很典型——当你调用paginate(10)之后,数据库查询已经被执行了,此时$users已经是LengthAwarePaginator类型的分页结果对象,而不是可以继续追加条件的查询构造器了,所以后面的where('location', 'like', '%bandung%')根本不会对数据库查询产生影响。
正确的写法应该是:
先把所有查询条件(包括可选的city条件)都加到查询构造器上,最后再调用paginate()执行查询。修改后的代码如下:
// 先初始化查询构造器,不执行查询 $usersQuery = \App\User::join('profiles', 'users.id', '=', 'profiles.member_id') ->where(function($query) { $query->where('first_name', 'like', '%z%') ->orWhere('last_name', 'like', '%z%'); }); // 检查是否有city参数,有则追加条件 if ($request->has('city')) { $usersQuery->where('location', 'like', '%bandung%'); } // 最后执行分页查询 $users = $usersQuery->paginate(10);
为什么原来的写法不生效?
Laravel的查询构造器是延迟执行的——只有当你调用paginate()、get()、first()这类方法时,才会真正触发数据库查询。一旦执行了这些方法,得到的就是结果集合/分页对象,再对这个对象调用where(),只会在内存里对已有的结果进行过滤(而且Laravel的分页对象其实并不支持这种链式的where操作),不会修改原本的SQL查询。
这样调整后,当请求里存在city参数时,对应的where条件就会被正确加入到最终执行的SQL里啦~
内容的提问来源于stack exchange,提问作者Aslam H
相关产品推荐
相关产品推荐

