Laravel Eloquent中all()后where查询失效,除DB::table外如何实现?
问题解答:Laravel模型查询替代方案
嘿,这个问题我碰到过!咱们先搞清楚为啥第二种写法不生效——其实是因为ExampleTable::all()返回的是Eloquent集合,而不是查询构造器实例。集合的where方法是在内存里过滤已经拉取的所有数据,虽然理论上->where('id',1)->first()应该能拿到结果,但可能是场景里有特殊情况?不过更关键的是,咱们有更合适的替代方案,不用绕到DB::table:
方案1:直接用模型的查询构造器(最推荐)
别先调用all(),直接在模型上链式调用where和first,这样查询是在数据库层面执行的,比拉取所有数据再过滤高效太多:
$elem = ExampleTable::where('id', 1)->first();
其实这和你用find(1)本质是一样的,find()就是Laravel封装的where('id', $id)->first()语法糖,只是写法更简洁。
方案2:如果已经拿到集合,用集合的firstWhere方法
要是你已经通过all()获取了整个集合(比如业务上需要先拿到所有数据做其他操作),可以用集合的firstWhere方法直接定位到目标元素,比where()->first()更简洁直观:
$table = ExampleTable::all(); $elem = $table->firstWhere('id', 1);
额外小提示
如果原来的$table->where('id',1)->first()确实没拿到结果,不妨检查下:
- 集合里是否真的存在
id=1的元素 - id的类型是否匹配(Laravel集合的
where默认是严格比较,比如数据库id是字符串类型,你传数字1就会匹配失败,这时候可以用where('id', '=', '1', false)关闭严格比较)
内容的提问来源于stack exchange,提问作者gokturk
相关产品推荐
相关产品推荐

