NooBiToo
@NooBiToo

Как вывести все записи по тегу через отношения?

Доброго времени суток
начал изучать Laravel, не могу понять и разобраться с отношениями полиморфными
Получилось так что у меня есть 3 таблицы:
1) articles
2) categories:
3) categoryable
собственно 3ая таблица промежуточная содержит: category_id(id категории) и categoryable_id(id поста)
У постов может быть несколько категорий, и я не могу понять как выводить, допустим если я делаю что то на подобие "Моей ленты" где подписываюсь на несколько категорий
как формируется такая страница?
а точнее как будет выглядеть вывод?
  • Вопрос задан
  • 3009 просмотров
Решения вопроса 1
Razgelday
@Razgelday
Полиморфные связи нужны, когда одна модель может быть связана с несколькими другими моделями. Например: модель "тег" может быть связана как с моделью "статья", так и с моделью "видео".

А у вас обычная связь many-to-many: у одного поста может быть сразу несколько категорий, а одна категория может содержать сразу несколько постов.

Идем в документацию Laravel (https://laravel.com/docs/master/eloquent-relations... и делаем все как там описано:

// Article.php
class Article extends Model
{

    // ...

    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }

    // ...

}

// Category.php
class Category extends Model
{

    // ...

    public function articles()
    {
        return $this->belongsToMany('App\Article');
    }

    // ...

}


Тогда таблицы в БД должны быть такие:

articles
 - id
 - title
 - desc

categories
 - id
 - slug
 - name

article_category
 - id
 - article_id
 - category_id


Теперь, допустим, у вас есть список id тех категорий, на которые подписан пользователь (переменная $subscribedOn). Тогда, получить все посты для ленты этого пользователя можно так:

$subscribedOn = [ 1, 2, 3 ]; // ID категорий, на которые подписан пользователь

$articlesForUser = Article::whereHas('categories', function(Builder $query) use ($subscribedOn) {

    $query->whereIn( 'categories.id', $subscribedOn );

})->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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