从枢纽加载Laravel关系

时间:2019-05-20 10:16:07

标签: laravel pivot relation

我遇到了问题,但想知道我是否做错了方向。

我的情况是这样:

  • 我有一个名为“页面”的表,其中包含网站上的页面列表。
  • 每个页面可以包含许多“模块”(表格,日历等)。所以我有一个名为“模块”的表
  • 我有一个“ module_page”数据透视表,可将模块绑定到页面
  • 最后,“表单”模块是通用的。表格有不同类型(反馈表格,注册表格等)。所以我有一个叫做“表格”的表格

就本示例而言,我仅对“表单”模块感兴趣。各个表单本身是“表单”的特定实例,所以我称它们为“特定”

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');

什么是最佳解决方案?

谢谢

0 个答案:

没有答案