Laravel eloquent - 一对多关系

4
我刚开始接触 Laravel v3,并尝试通过创建博客来理解 Eloquent 的一对多关系。我的帖子与类别有多对一的关系(每个帖子都与一个类别相关联)。
我有以下表格和字段: < p > < strong > 帖子 :id、标题、正文、创建日期、category_id

类别:id、名称

我有以下两个模型:
class Category extends Eloquent 
{
    public function posts()
    {
        return $this->has_many('Post');
    }
}

class Post extends Eloquent 
{
    public function categories()
    {
        return $this->belongs_to('Category');
    }
}

我找到了一种通过传递分类ID获取所有帖子的方法:

category::find(2)->posts()->get())

我需要帮忙找出如何获取所有文章及其相应的分类。因此,在视图中,最终我可以输出类似于以下内容:

{$post->title} -  Category: {$post->category->name}

感谢您的任何帮助!

我认为你正在寻找Eager Loading - Robert K
2个回答

16

我希望您会发现这些提示有用。

在post模型中将categories函数重命名为category。因为belongs_to关系是单数的,所以这篇文章只能属于一个类别。

关系还有一个简写语法,这个简写语法很有用,因为它更清晰,并且结果被缓存。以下是一个例子:

$category = Category::find(1);
foreach($category->posts as post) {
    echo $post->title;
}

现在举个例子,说明如何获取所有帖子及其相关分类:

$posts = Post::all();
foreach($posts as $post) {
    echo $post->category->name;
}

做完第二个例子后,你很快就会注意到一个问题,即查询数量会随着文章数量的增加而增加。这被称为N+1效应。 例如,如果你有5篇文章,则将执行一个查询来获取这些文章。 然后在循环中,我们将执行一个查询以获取类别。 这将导致总共执行6个查询。

为了解决这个问题,使用贪婪加载可以将我们示例中的6个查询减少到2个。

$posts = Post::with('category')->all();
foreach($posts as $post) {
    echo $post->category->name;
}

希望这能帮到你!


希望这也适用于 Laravel 4。我有一个小问题。我是新手。你能告诉我这个急切加载是要在控制器/视图中输入吗? - harishannam
通常这个操作会在控制器中完成,或者是一个称为仓库的包装类,由控制器使用。你不应该在视图中执行此操作。就我所知,在L4中所有这些都保持不变。 - William Cahill-Manley

0

Laravel 4 的语法略有不同,它使用驼峰式命名来构建表达式(而 L3 使用下划线命名法)。Laravel(L4)的新语法现在符合 PSR-1 标准。

L3 : $this->belongs_to('Category');
L4 : $this->belongsTo('Category');

为了证明“急切加载”可以提高应用程序的性能(通过最小化数据库查询),可以使用Laravel的事件生态系统。
// app/routes.php 
Event::listen('illuminate.query', function($sql) { echo '<h4>' . $sql . '</h4>' ;});

.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接