@junart

Отношения между таблицами(моделями) в Laravel?

Имеется 3 таблицы: Статьи, Категории_статей, Категории_пользователя.

  1. Каждая статья может относится к одной и более категориям.
  2. Каждый пользователь может быть подписан на одну или более категорий.
  3. Таблица Пользователи не связана с таблицей Статей.


Мне нужно вывести все статьи на которые подписан пользователь по категориям.
Все мои попытки выстроить отношениям между моделями не увенчались успехом.

Склоняюсь к Has-Many-Through, что так же не сработало.
Подробный вопрос задан на стеке: stackoverflow.com/questions/42458971/how-to-rewrit...

В итоге, что я получил:

$res = User::with(array('categories' => function($query)
        {
            $query->with('categoryAnn.announcements');
      
        }))->where("id", 1)->get();


Model user:

public function categories()
    {
        return $this->hasMany('App\CategoryUser', "user_id", "id");
    }


Model CategoryUser:

public function categoryAnn()
    {
        return $this->hasMany("App\AnnouncementCategory", "category_id", "category_id");
    }


Model AnnouncementCategory:

public function announcements()
    {
        return $this->belongsTo("App\Announcement", "announcement_id", "id");
    }


Похоже, что работает. НО!
Как добраться до конечного Announcement, не писать же 5 вложенных циклов?! Имею ввиду нужно пройтись по коллекции User потом внутри по categories затем по CategoryUser, потом по categoryAnn и наконец по announcements. Это пи**ц какой-то...

Структура таблиц:
CREATE TABLE Announcements
	(`id` int, `name` varchar(7))
;

CREATE TABLE Categories_announcements
	(`announcement_id` int, `category_id` int)
;

CREATE TABLE Categories_user
	(`category_id` int, `user_id` int)
;
	
INSERT INTO Announcements
	(`id`, `name`)
VALUES
	(1, 'OpenIDM'),
	(2, 'OpenAM'),
	(3, 'OpenDJ')
;

INSERT INTO Categories_announcements
	(`announcement_id`, `category_id`)
VALUES
	(1, 1)
;

INSERT INTO Categories_user
	(`category_id`, `user_id`)
VALUES
	(1, 1)
;


sqlfiddle.com/#!9/ec162/3
  • Вопрос задан
  • 636 просмотров
Пригласить эксперта
Ответы на вопрос 2
Ставьте у пользователя связь hasMany к категориям пользователя, а у категорий ставьте также связь hasMany к статьям. А затем делайте User::with('categories' => function($query) {$query->with('articles')}) и разбирайте полученный массив
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
А разве так не работает?
User::with(
    ['categories', 'categoryAnn', 'categoryAnn.announcements']
)->find($userId);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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