当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩-一对多的关系

拓拔谭三
2023-03-14

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

我有以下表格和以下字段:

帖子:id、标题、正文、创建日期、类别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}

感谢任何帮助!

共有2个答案

穆丁雨
2023-03-14

Laravel4的语法稍有不同,它使用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>' ;});

...

罗兴运
2023-03-14

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

在post模型上,将类别函数重命名为类别。一个所属的关系是单数的,所以这篇文章只有一个类别。

关系也有一个速记,这种速记语法很有用,因为它使用起来更简洁,并且结果被缓存。举个例子:

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

现在一个例子,如何获得所有的职位与他们的相关类别:

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

现在,在执行第二个示例时,您会很快注意到的一件事是,每个帖子的查询数量都在增加。这就是所谓的n1效应。例如,如果您有5篇文章,将执行一个查询来获取这些文章。然后在循环中,我们执行一个查询来获取类别。这将导致总共6个查询。

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

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

我希望这有帮助!

 类似资料:
  • 我有帖子表和评论表。我想得到所有的帖子与它的评论和以下返回只是帖子有评论: 更新 例如 ID帖 1个职位1 2后2 id post\u id评论 1萨姆勒大学评论 Post::with('comments')只返回有注释的帖子,它只返回第一篇帖子,因为第二篇帖子没有注释,我想获取所有帖子(有注释或没有注释)

  • 我正在使用Laravel 5创建一个博客,但我对多对多(通过透视表)关系有一个奇怪的问题。我的DB设置如下: 文章表: id|bigint|20|PK|不为空|自动增量 title|varchar|255|不为空 body|text|不为空 category_id|bigint|20|不为空 created_at|时间戳|不空 updated_at|时间戳|非空 已发布|布尔值|非空 delete

  • 如何制作一对多访问器? 用户模型: 历史模型: 如果我真的喜欢下面,它将工作。 用户模型: 历史模型: 控制器: 刀片视图: 它起作用了! 但是,我应该怎么做,如果我想要这个: 我喜欢 历史模型: 它不工作! 如果我编码像 它会回来的 此集合实例上不存在属性[happy]。 如果我编码像 它会回来的 未定义的属性:Illumb\Database\Eloquent\Relations\HasMany

  • 在我的应用程序中,我更新了从一对多到多对多的关系,我试图找出一种持久化关联功能的方法。 假设我有两个相关的表,例如狗和主人。如果我有一系列的主人,并且我正试图为这些主人获取一份狗的id列表,我应该如何雄辩地做到这一点? 这里也提出了类似的问题:https://laracasts.com/discuss/channels/laravel/getting-many-to-many-related-da

  • 我有以下三个表格: 所以基本上这种关系就像: 用户有许多项目 项目属性到客户端 我的问题是: 如何使用eloquent获得用户的所有客户端? 似乎我不能用户hasManyPass方法,因为在客户端表中没有project_id。 因此,我希望达到的目标是:

  • 我使用的是Laravel 5.4,其模型和表格结构如下: 一个用户可以有多个账户 一个帐号可以被多个用户共享 每个账户有多个持有量 因此,用户通过他们的许多帐户间接拥有许多资产。 我需要帮助在用户模型上定义一个称为“持有量”的关系,以获得适用于用户的所有持有量(基于他们所链接的账户)。 我尝试了很多不同的东西,在谷歌上花了很长时间。我可以接近BelongToMany和hasManyThrough,