10月CMS属于与自己的关系Man / ToMany

问题描述 投票:0回答:1

我遵循此处给出的出色答案:October CMS relation to self

但是有一个问题;这是一种单向的关系。就我而言,我有一个“域”,其中可以有许多域。但是,尽管“域A”链接到“域B”和“域C”,但这并非相反。当编辑“域B”时,使用Hardik给出的方法未将其链接到“域A”。

文档状态:

“要定义多对多关系的逆,您只需在相关模型上放置另一个$ belongsToMany属性。“

,但这是不可能的,因为模型只能具有一个$belongsToMany属性?

那么我如何实现与自身的逆关系?

octobercms octobercms-backend
1个回答
0
投票

因此,当我完成了几个自引用关系时,我发现使用主要模型为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

enter image description here

解决方案1-创建逆关系-现在的问题是,您必须检查模型的relationinverseRelation

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,我很想知道是否有人找到了执行此操作的最佳方法。这些是我找到的解决方案,到目前为止,我已经了解了。

© www.soinside.com 2019 - 2024. All rights reserved.