получение данных из сводной таблицы в laravel

#php #laravel #eloquent #pivot-table

#php #laravel #красноречивый #сводная таблица

Вопрос:

У меня есть 3 таблицы: post , tag , tag_post.

Я сохраняю post_id в post / tag_id в tag / и оба они в 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
  

Ответ №2:

Если вам нужно получить 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. Вы можете попробовать это $p->tag()->get('name')