【问题标题】:Laravel eloquent - One to many relationshipsLaravel 雄辩 - 一对多关系
【发布时间】:2012-10-08 03:05:33
【问题描述】:

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

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

帖子:id、标题、正文、date_created、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}

感谢您的帮助!

【问题讨论】:

标签: php laravel eloquent laravel-3


【解决方案1】:

希望这些提示对您有用。

在 post 模型上,将 categories 函数重命名为 categorybelongs_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 也是如此。我有一个小小的疑问。我是新来的。你能判断这个急切加载是否必须在控制器/视图中输入?
  • 通常这将在控制器中完成,或者在控制器使用的称为存储库的包装类中完成。你不应该在视图中这样做。据我所知,所有这些在 L4 中都保持不变。
【解决方案2】:

Laravel 4 的语法略有不同,它使用 camelCase 来构建表达式(而 L3 使用 snake_Case 语法)。Laravel (L4) 的新语法现在是 PSR-1 compliant

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

要证明“急切加载”可以提高应用程序的性能(通过最小化数据库查询),请使用 Laravel 的事件生态系统。

// app/routes.php 
Event::listen('illuminate.query', function($sql) { echo '<h4>' . $sql . '</h4>' ;});

.

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2018-11-14
    • 2015-07-01
    • 2019-03-10
    • 2018-03-28
    • 2016-11-03
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多