我遵循此处给出的出色答案:October CMS relation to self
但是有一个问题;这是一种单向的关系。就我而言,我有一个“域”,其中可以有许多域。但是,尽管“域A”链接到“域B”和“域C”,但这并非相反。当编辑“域B”时,使用Hardik给出的方法未将其链接到“域A”。
文档状态:
“要定义多对多关系的逆,您只需在相关模型上放置另一个$ belongsToMany属性。“
,但这是不可能的,因为模型只能具有一个$belongsToMany
属性?
那么我如何实现与自身的逆关系?
因此,当我完成了几个自引用关系时,我发现使用主要模型为key
和加入模型为otherKey
的多对多关系函数。解释器始终是这样工作的。我在这里找到了示例和解决方案。
这里是一个belongsToMany关系
public $belongsToMany = [
'relation' => [
'Author\Plugin\Models\Datas',
'table' => 'author_plugin_datapivot',
'key' => 'relation_one',
'otherKey' => 'relation_two'
]
];
要使工作表在工作表中获得多对多的两种关系,必须看起来像这样。 Relation_one包含record.id
| lationship_two包含relation.id
和递归relation.id
| record.id
。
解决方案1-创建逆关系-现在的问题是,您必须检查模型的relation
和inverseRelation
。
public $belongsToMany = [
'relation' => [
'Author\Plugin\Models\Datas',
'table' => 'author_plugin_datapivot',
'key' => 'relation_one',
'otherKey' => 'relation_two'
],
'inverseRelation' => [
'Author\Plugin\Models\Datas',
'table' => 'author_plugin_datapivot',
'key' => 'relation_two',
'otherKey' => 'relation_one'
]
];
解决方案2-在Save之后创建一个函数-我无法按照我想要的方式运行它-我相信这是可能的,我的理论是访问模型的关系,然后遍历它们之间的关系以附加此记录。但是我认为附加关系是在保存模型之后完成的,因此您还没有访问关系的权限。可能仍然可以使用此方法,例如临时字段保存要保存的记录的ID。我不会尝试的。
public function afterSave()
{
$relations = $this->relations;
dd($this);
foreach ($relations as $relation) {
$relation->relations()->attach($this);
}
}
解决方案3-创建组件/类函数-之所以选择它,是因为我几乎不使用后端来编辑模型数据。我创建了一个类函数来递归处理关系。需要注意的关键事项是,我发现删除所有附加关系(detach()
)更快,然后检查是否附加了重复项。这很重要,因为附加重复项会出错。还要注意,使用类函数,我可以在不想使用多对多关系的情况下查找唯一的属性。
public function attachMany($field, $record, $relation)
{
if ($record->relations->first()) {
foreach ($record->relations as $relation) {
$relation->relations()->detach($record);
$record->relations()->detach($relation);
}
}
if ($field->unique) {
$relationRecord->relation_bto()->add($record);
} else {
$relationRecord->relations()->attach($record);
$record->relations()->attach($relationRecord);
}
}
PS,我很想知道是否有人找到了执行此操作的最佳方法。这些是我找到的解决方案,到目前为止,我已经了解了。