Октябрь CMS принадлежит ToMany / имеет много отношения к себе - PullRequest
0 голосов
/ 08 февраля 2020

Я последовал за превосходным ответом, данным здесь: Октябрьское отношение CMS к себе

Но осталась одна проблема; это односторонние отношения. В моем случае у меня есть «домен», который может иметь много доменов. Однако, хотя «домен A» связан с «доменом B» и «доменом C», это не было наоборот. При редактировании «Домена B» он не был связан с «Доменом A» при использовании метода, данного Хардиком.

Документация гласит:

"Чтобы определить обратное множество отношение «ко многим», вы просто помещаете другое свойство $ ownToMany в связанную модель. "

, но это невозможно, поскольку модель может иметь только одно свойство $belongsToMany?

Так как я могу понять обратное по отношению к себе?

1 Ответ

0 голосов
/ 12 февраля 2020

Так как я установил пару самоссылающихся отношений, я обнаружил, что функция отношения многие ко многим использует первичную модель - key, а модель соединения - otherKey. Это всегда, как работает переводчик. Вот примеры и решения, которые я нашел.

Вот отношение ownToMany

public $belongsToMany = [
    'relation' => [
        'Author\Plugin\Models\Datas', 
        'table' => 'author_plugin_datapivot', 
        'key' => 'relation_one', 
        'otherKey' => 'relation_two'
    ]
];

Чтобы получить двустороннюю взаимосвязь, работающую в сводной таблице, нужно посмотреть нравится. отношение_one содержит record.id | отношение_твое содержит relation.id и рекурсивный relation.id | record.id.

enter image description here

Решение 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 - Создать функцию afterSave - я не мог заставить это работать так, как я хотел - Я считаю, что это возможно, моя теория состояла в том, чтобы получить доступ к отношениям модели и затем выполнить их, чтобы прикрепить эту запись. Однако я думаю, что прикрепление отношения выполняется после сохранения модели, поэтому у вас еще нет доступа к отношениям. Возможно, есть способы использовать этот метод, например временное поле, содержащее идентификаторы записей, которые вы хотите сохранить. Я не собираюсь пробовать это все же.

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 Мне было бы интересно узнать, нашел ли кто-нибудь самый оптимальный способ сделать это. Это решения, которые я нашел и до сих пор получил.

...