2014-07-05 136 views
0

我有3个表格:post,tag,tag_post。从laravel中的数据透视表中获取数据

我将帖子中的post_id保存到/ tag_id中,并将它们都保存在tag_post中。

我该如何显示每个帖子的标签?我怎样才能从tag_post表中选择数据?

这是我的Post模型:

public function tag() 
     { 
      return $this->belongsToMany('Tag','tag_post'); 
     } 

,它是我的标签型号:

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 

感谢您的时间。

回答

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 
1

如果您需要从每个post获得tags,您需要一个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表中获取数据,查看使用数据透视表的文档。

http://laravel.com/docs/eloquent#working-with-pivot-tables

+0

谢谢回复。请检查http://laravel.io/bin/6E0Rq – saha

+0

您可以试试这个'$ p-> tag() - > get('name')' – Oni

相关问题