Загрузка Laravel отношения с шарниром - PullRequest
1 голос
/ 20 мая 2019

У меня проблема, но мне интересно, делаю ли я что-то неправильно.

Моя ситуация такова:

  • У меня есть таблица "pages", которая содержит список страниц на веб-сайте.
  • Каждая страница может содержать множество «модулей» (Форма, Календарь и т. Д.). Итак, у меня есть таблица под названием «Модули»
  • У меня есть сводная таблица "module_page", которая связывает модули со страницами
  • Наконец, модуль "form" является универсальным. Существуют различные виды форм (форма обратной связи, регистрационные формы и т. Д.). Итак, у меня есть таблица под названием "формы"

Для целей данного примера меня интересует только модуль «Форма». Сами отдельные формы являются конкретными примерами «формы», поэтому я назвал их «спецификой»

pages            modules
+----+--------+  +----+----------+
| id | name   |  | id | name     |
+----+--------+  +----+----------+
| 1  | page a |  | 1  | calendar |
+----+--------+  +----+----------+
| 2  | page b |  | 2  | form     |
+----+--------+  +----+----------+

forms            module_page
+----+--------+  +---------+-----------+-------------+
| id | name   |  | page_id | module_id | specific_id |
+----+--------+  +---------+-----------+-------------+
| 1  | form a |  | 1       | 2         | 1           |
+----+--------+  +---------+-----------+-------------+
| 2  | page b |  | 2       | 2         | 2           |
+----+--------+  +---------+-----------+-------------+

Модель моей страницы выглядит следующим образом

page.php

public function modules()
{
    return $this->belongsToMany(Module::class)->withPivot('specific_id')
}

когда я запускаю $page = Page::where('id', 1)->with('modules');, я успешно получаю следующее

Array
(
    [id] => 1
    [name] => page a

    [modules] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [name] => form
                    [pivot] => Array
                        (
                            [page_id] => 4
                            [module_id] => 6
                            [specific_id] => 1
                        )
                )
        )
)

Пока все хорошо. Но то, что я хотел бы сделать сейчас, это включить конкретную форму в качестве дочернего элемента модуля. Таким образом, результат будет:

Array
(
    [id] => 1
    [name] => page a

    [modules] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [name] => form
                    [specific] => Array
                        (
                            [id] => 1
                            [name] => form a
                        )
                    [pivot] => Array
                        (
                            [page_id] => 4
                            [module_id] => 6
                            [specific_id] => 1
                        )
                )
        )
)

У меня проблемы с этим, потому что specific_id является частью сводной таблицы, а не частью модуля. Я попробовал следующее в попытке «закрой глаза и надейся на лучшее», но, очевидно, это не сработало

module.php

public function specifics()
{
    return $this->hasOne(Form::class, 'id', 'pivot.specific_id');
}

$page = Page::where('id', 1)->with('modules.specifics');

Какое лучшее решение?

Спасибо

...