Laravel中find方法失效求助:如何让其正常返回指定ID数据
解决Laravel中find方法关联查询返回错误结果的问题
嘿,我来帮你捋清楚这个问题!你遇到的情况是因为调用方法的顺序错了,导致查询逻辑和你预期的不一样。
为什么第一段代码返回id=1的帖子?
你写的第一段代码:
public function edit($id) { $post = Post::find($id)->with(['comments'])->first(); return $post; }
这里的执行逻辑是这样的:
Post::find($id)已经立即执行了数据库查询,返回了id=12的Post模型实例。- 接着调用
with(['comments']),这时候是在这个已有的模型实例上准备预加载关联,但并没有改变当前的模型。 - 最后调用
first(),这个方法会忽略之前的find($id)结果,直接重新查询Post表的第一条记录(也就是id=1的帖子),所以返回了错误的结果。
正确的写法有两种:
方式1:先预加载关联,再用find查询
把with()放在find()前面,这样是先构建完整的查询(包含预加载),再根据id获取对应的帖子:
public function edit($id) { $post = Post::with(['comments'])->find($id); return $post; }
find($id)本身就会返回单个模型实例,不需要再调用first()了。
方式2:先查询模型,再延迟加载关联
如果你已经用find()获取了模型,想要加载关联的话,可以用load()方法(延迟加载):
public function edit($id) { $post = Post::find($id); $post->load(['comments']); // 加载关联 return $post; }
为什么第二段代码是对的?
你写的第二段代码:
public function edit($id) { $post = Post::where('id', $id)->with(['autor'])->first(); return $post; }
这里的逻辑是先构建查询链:添加where条件、添加预加载关联,最后调用first()执行查询,自然会返回符合id=12的帖子,所以结果正确。
内容的提问来源于stack exchange,提问作者user11729318
相关产品推荐
相关产品推荐

