laravel Eloquent ORM关联常见问题

laravel Eloquent ORM关联常见问题

2016-05-03 12:58:39  回复(6  分享

这个问题自己经常遇到,写下来提醒下自己以后注意。

假设有如下两张表:

post:id, title, contents, created_at, updated_at

comments:id, post_id, title , content, created_at

这是一张帖子表即其关联的评论表,有如下模型:

namespace App;

class Post{

public function comments(){

return $this->hasMany('App\Comment');

}

}

class Comment{

public function post(){

return $this->belongsTo(App\Post);

}

}

两个表之间关联关系建好了,平时使用的时候没啥问题,不过如果使用渴求式加载关联模型就出问题了,代码如下:

$post = Post::with([

'comments' => function($query){

$query->select('title', 'created_at');

}

])->get();

如代码所见,改代码读取了帖子列表,并读取了每条帖子所关联的评论。为了减少返回的数据量,我用渴求式加载时添加了查询条件,进查询title和created_at两个字段。问题就出在这里,这时我们是无法获取到post所关联的comments的。

经过分析,使用渴求式加载的时候laravel将会采用IN查询将所有post_id为读取的post列表的id值的comments查询出来,查询是没问题,然而查询完成后数据与post建立关联关系的时候就出问题了。由于我的查询条件并没有把关联字段post_id查询出来,导致在建立关联关系的时候无法确定哪个comment关联哪个post,于是结果就空了。

还有一种情况也会导致此问题:

$post = Post::select('title')->with('comments')->find(1);

这回我给post限定了查询字段,并没有查询需要用于与comments关联的字段:id,因此也是无法获取正确的关联关系的。

最近连续被坑了两次,写篇小文记录一下。

评论

felix

2017-11-22 15:01:03

非常赞

发表评论:

*您的昵称:
*评论内容:
*您的性别:   
您的Email: (可选,您的留言被回复后用于提醒,不公开)