0

我想要一个属于另一个模型的模型。在我的控制器中,我想获取该模型中的所有项目,但我也想要它所属的表中的属性。例如:

class Comment extends Eloquent {

    public function post()
    {
        return $this->belongsTo('Post');
    }

}

在我的控制器中,我可以执行以下操作来获取评论数据:

$comments = Comment::first();

但是,这只会给我来自评论表的数据(并且没有来自帖子表的连接数据)。我希望帖子表中每个评论所属行的数据可用作我的评论模型的属性。我知道我还可以执行以下操作来从帖子表中获取数据:

$comments = Comment::first();

这样做的问题是它使用两个数据库查询(#1 获取评论,#2 获取它所属的帖子数据)。有没有办法让我从两个表中获取数据到我的模型中,相当于一个连接语句:

SELECT * FROM comments LEFT JOIN posts ON comments.post_id = posts.id

我知道我在不使用我的 Comment 或 Post 模型的情况下手动构建了一个连接查询,但是我的 Comment 模型中有几种方法,我希望能够将这些方法用于检索到的数据。有谁知道我怎么能做到这一点?

4

3 回答 3

4

有关急切加载的文档中

值得庆幸的是,我们可以使用急切加载来大幅减少查询数量。应该预先加载的关系可以通过 with 方法指定 [...]

使用该with()参数将在一对多关系中使用恒定数量的查询†。因此,此查询应在一个查询中检索您的评论及其相关帖子:

$comments = Comments::with('post')->get();

† 一个固定数量的查询,而不是每条评论的查询计数线性增加

于 2013-09-11T12:54:19.103 回答
1

如果您只想在后台完成一个查询来获取结果,而不使用with(),您可以使用fluentand join()

SELECT * FROM comments LEFT JOIN posts ON comments.post_id = posts.id

等于:

DB::table('comments')
    ->join('posts','comments.post_id','=','posts.id','left')
    ->get();

但我认为也添加一个groupBy()语句会给你更好的结果:

例子:

DB::table('comments')
    ->join('posts','comments.post_id','=','posts.id','left')
    ->groupBy('comments.id')
    ->get();

但我更愿意在我的项目中使用其他答案:

Comment::with('post')->get();
于 2013-09-11T08:08:09.367 回答
0

$comments:: all()->with ('post')->get()

于 2013-09-11T06:50:51.503 回答