Имеется 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