#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
таблицы, ознакомьтесь с документацией по работе со сводной таблицей.
Комментарии:
1. Вы можете попробовать это
$p->tag()->get('name')