@wagwandude

Как построить отношения между моделями?

Всем привет.
Пытаюсь разобраться с отношениями между таблицами для взаимодействия с данными, но никак не получается.

У меня есть таблицы:
categories - в которой хранятся созданные категории.
posts - где хранятся все статьи.
item_category - где хранится post_id и category_id.

Мне нужно получить все категории (вместе с name и slug из таблицы categories), которые принадлежат посту.

Основная проблема - я не могу понять, как их связать между собой.

Есть hasOne, но в нашем случае он, вроде как, не нужен.
Есть hasMany, с помощью него я могу получить категории для текущего поста, создав в модели Category:

protected $table = 'categories';
public function category()
{
    return $this->hasMany('App\Models\ItemCategory', 'id');
}

(имеет ли смысл еще связать Category с Post посредством belongTo?

И вызвав в PostControllers, для теста:

$post = Post::where('slug', '=', $slug)->first();
$category = $post->category;
foreach ($category as $c)
{
    echo $c->category_id . '<br>';
}

Выводятся ID категории, которые принадлежат текущему посту.

Но как мне присоединить к ним еще и модель ItemCategory (в DB: item_category), чтобы получить название категории и её ссылку?

Понимаю, что вопрос очень простой, но мне необходимо разобраться)
Поэтому если кто-то покажет на пальцах, как стоит мыслить при формировании отношений - будет отлично!

Заранее спасибо.
  • Вопрос задан
  • 257 просмотров
Решения вопроса 1
@Result007
P|-|P
Привет! Давай по порядку :)

1. Так как у тебя отношения много ко многим (если это не так, будет по другому), то ты правильно сделал третью табличку. Модель для нее делать не нужно! Отношения будут выглядеть так:
Модель категории: Category.php
protected $table = 'categories';
public function posts()
{
    return $this->belongsToMany('App\Models\Post', 'post_id', 'category_id);
}

Модель поста: Post.php
protected $table = 'posts';
public function categories()
{
    return $this->belongsToMany('App\Models\Category', 'post_id', 'category_id);
}


2. Для того, чтобы работать с категориями поста ( и в обратном порядке):
$post = Post::where('slug', $slug)->first();  -----> равенство идет по дефолту
$categories = $post->categories;
foreach ($categories as $category)
{
    echo $category->id. '<br>';   -----------------> любые данные категории.
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы