从laravel中的数据透视表获取数据

时间:2014-07-05 08:37:40

标签: php laravel eloquent pivot-table

我有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 
谢谢你的时间。

2 个答案:

答案 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表中获取数据,请查看有关使用数据透视表的文档。

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

答案 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