Laravel 5.2中如何基于模型属性创建WHERE子句查询关联数据
解决Laravel关联查询筛选书籍的问题
嘿,我来帮你搞定这个关联查询的小坑~
你当前遇到的问题核心在于调用时机不对:你写的User::find(2)->books->where(...)是先把该用户的所有书籍都拉取到内存中的Eloquent集合里,再用集合的where方法做过滤——这不仅效率低(数据量大时更明显),而且集合的where和数据库查询构造器的where逻辑有差异,导致筛选结果不符合预期。
正确的数据库层面筛选写法
要在数据库层就完成筛选,你需要调用关联关系的查询构造器实例,也就是给books加上括号(),这样就能直接生成带筛选条件的SQL,只拉取符合要求的数据:
// 方式1:链式调用where $filteredBooks = User::find(2)->books() ->where('pages', '>', 100) ->where('chapters', '>', 3) ->get(); // 方式2:数组形式的where(和你原来的写法对应) $filteredBooks = User::find(2)->books() ->where([ ['pages', '>', 100], ['chapters', '>', 3] ]) ->get();
补充说明
User::find(2)->books返回的是Illuminate\Database\Eloquent\Collection(内存集合),它的where方法是对已加载的数据做内存过滤;User::find(2)->books()返回的是Illuminate\Database\Eloquent\Relations\HasMany(查询构造器),它的where是在数据库层面添加筛选条件,最后通过get()获取最终的结果集合,这种方式更高效也更符合你的需求。
另外你提到期望获取user_id=0的书籍?如果是这个需求,不需要通过User模型关联,直接查询Book模型即可:
$books = Book::where('user_id', 0) ->where('pages', '>', 100) ->where('chapters', '>', 3) ->get();
内容的提问来源于stack exchange,提问作者Omda
相关产品推荐
相关产品推荐

