我刚开始使用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}
感谢您的帮助!
答案 0 :(得分:15)
我希望您会发现这些提示很有用。
在帖子模型上将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;
}
我希望有所帮助!
答案 1 :(得分:0)
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>' ;});