我有3个表:post,tag,tag_post。
我在post / tag_id中将post_id保存在tag /中,并将它们保存在tag_post中。
如何显示每个帖子的标签?如何从tag_post表中选择数据?
这是我的Post模型:
public function tag()
{
return $this->belongsToMany('Tag','tag_post');
}
这是我的Tag模型:
public function post()
{
return $this->belongsToMany('Post','tag_post');
}
这是我的控制器:
$posts=Post::orderBy('id','DESC')->paginate(5);
///but I dont know how can i show each post's tags under it
谢谢你的时间。
答案 0 :(得分:1)
如果您需要从tags
获取post
,则需要foreach
循环。
foreach ($posts as $post)
{
var_dump($post->tags); // your individual post's tags will be here
}
另外,尽管我不喜欢捅我的鼻子,但如果遵循框架本身的惯例会更好。 (即在多对多关系中使用复数形式)
发布模型
public function tags() // <-- note the plurals
{
$this->belongsToMany('Tag', 'tag_post');
}
标记模型
public function posts() // <-- note the plurals
{
$this->belongsToMany('Post', 'tag_post');
}
如果您需要从tag_post
表中获取数据,请查看有关使用数据透视表的文档。
答案 1 :(得分:1)
这里有一些事情(我会保持简单,所以没有orderBy或其他任何东西,我还假设您将关系重命名为复数:tags()
和posts()
以便于阅读和使用) :
$posts = Post::paginate(5); // returns a Collection of Post models, 1 db query
foreach ($posts as $post) {
$post->tags; // Collection of Tag models, fetched from db for each $post
}
这意味着5 + 1个查询。它当然不会扩展,所以我们需要http://laravel.com/docs/eloquent#eager-loading
这导致我们:
$posts = Post::with('tags')->paginate(5); // returns a Collection of Post models
// runs 1 query for posts and 1 query for all the tags
foreach ($posts as $post) {
$post->tags; // Collection of Tag models, no more db queries
}
所以要列出所有标签,你可以这样做:
@foreach ($posts as $post)
<tr>
<td>{{ $post->title }}</td>
<td>
@foreach ($post->tags as $tag)
{{ $tag->name }} // or whatever it is that you want to print of the tag
@endforeach
</td>
</tr>
@endforeach