【问题标题】:Laravel Staudenmeir hasManyDeep Relations Setup IssueLaravel Staudenmeir hasManyDeep Relations 设置问题
【发布时间】:2021-01-04 15:34:38
【问题描述】:

我无法使用 staudenmeir 包在 laravel 中设置我的关系 https://github.com/staudenmeir/eloquent-has-many-dee

我有“ServiceLog”模型 [由 belongsTo 定义的关系到“工具”模型] 我有“工具”模型[与属于“工具组”模型的关系]

我需要访问 ServiceLog 模型中的 ToolGroup。

回顾:ServiceLog - 多对一- 工具 - 多对多 - 组

我试试

return $this->hasManyDeep(
'App\Entities\ToolGroup',
['App\Entities\Tool','tool_has_group'],
)

但我得到了错误,因为查询在 Tool 表中生成了对 ServiceLog id 的搜索,但它是相反的。

你能帮我理解这个问题吗?

【问题讨论】:

    标签: laravel eloquent relationship


    【解决方案1】:

    如果我正确理解您的模型和关系,

    ToolGroup → 属于很多 → Tool → 有很多 → ServiceLog

    棘手的部分是ToolGroupTool 之间的多对多关系,但这只是另一个表。实际上,实际的表可能如下所示,尽管您的名称可能略有不同:

    tool_groupstool_tool_group(数据透视表)→toolsservice_logs

    获取工具组的服务日志如下所示:

    // App/Entities/ToolGroup.php
    
    public function serviceLogs() {
        return $this->hasManyDeep(
            'App\Entities\ServiceLog', 
            [
                'tool_tool_group',  // the pivot table between ToolGroup and Tool
                'App\Entities\Tool'
            ],
            [
                'tool_group_id',    // Foreign key on pivot table
                'id'                // Foreign key on "tools" table
                'tool_id'           // Foreign key on "service_logs" table
            ],
            [  
                'id',               // Local key on "tool_groups" table
                'tool_id',          // Local key on pivot table
                'id'                // Local key on "tools" table
            ]
        );
    }
    

    反之,即获取给定服务日志的工具组,您只需颠倒中间表键的顺序即可。假设如下:

    ServiceLog → 属于 → Tool → 属于许多 → ToolGroup

    您可以直接创建它,

    // App/Entities/ServiceLog.php
    
    public function toolGroups() {
        return $this->hasManyDeep(
            'App\Entities\ToolGroup', 
            [
                'App\Entities\Tool',
                'tool_tool_group'    // the pivot table between ToolGroup and Tool
            ],
            [  
                'tool_id',           // Foreign key on "service_logs" table
                'id',                // Foreign key on "tools" table
                'tool_group_id'      // Foreign key on pivot table
            ],
            [
                'id',                // Local key on "tools" table
                'tool_id'            // Local key on pivot table
                'id'                 // Local key on "tool_groups" table
            ],
        );
    }
    

    或者假设你已经在中间模型中定义了existing relationships,你可以使用hasManyDeepFromRelations方法:

    // App/Entities/Tool.php
    public function toolGroups() {
        return $this->belongsToMany('App\Entities\ToolGroup');
    }
    
    // App/Entities/ServiceLog.php
    public function tool() {
        return $this->belongsTo('App\Entities\Tool');
    }
    
    public function toolGroups() {
        return $this->hasManyDeepFromRelations($this->tool(), (new Tool)->toolGroups());
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2021-07-04
      • 2021-06-24
      • 2020-02-14
      • 2020-02-11
      • 2014-07-11
      • 2013-08-21
      • 1970-01-01
      • 2021-06-20
      相关资源
      最近更新 更多