繁体   English   中英

Laravel雄辩 - 一对多关系

[英]Laravel eloquent - One to many relationships

我刚刚开始使用laravel v3并试图通过创建博客来围绕雄辩的一对多关系,我的帖子与类别有多对一的关系(每个帖子都链接到一个类别)。

我有以下表格,其中包含以下字段:

帖子 :id,title,body,date_created,category_id

类别 :id,name

我有以下两种型号:

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}

谢谢你的帮助!

我希望你会发现这些技巧很有用。

在帖子模型上将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的语法略有不同,它使用camelCase构建表达式(而L3使用snake_Case语法).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>' ;});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM