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