如果我正确理解您的模型和关系,
ToolGroup → 属于很多 → Tool → 有很多 → ServiceLog
棘手的部分是ToolGroup 和Tool 之间的多对多关系,但这只是另一个表。实际上,实际的表可能如下所示,尽管您的名称可能略有不同:
tool_groups→tool_tool_group(数据透视表)→tools→service_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());
}