Laravel 5 отсоединить/удалить полиморфное отношение

У меня есть transactions table, в котором я могу хранить полиморфное отношение payment или plan. Чего я не могу понять, когда я обновляю существующую транзакцию и удаляю payment_id или plan_id в форме, как очистить это отношение из базы данных.

При вставке (или обновлении) это работает нормально:

$payment->transactions()->save($transaction);

Я пробовал много вещей, и метод detach не работает, так как это не отношение многие ко многим.

Мои модели:

Сделка:

public function paymentable()
{
    return $this->morphTo();
}

Оплата (и план):

public function transactions()
{
    return $this->morphMany(Transaction::class, 'paymentable');
}

Любые идеи?

В основном мой вопрос заключается в следующем: как я могу очистить paymentable_id и paymentable_type, когда я выполняю обновление существующей транзакции, когда не было отправлено payment или plan? Так что в основном, когда payment или plan были удалены из формы. Я предпочитаю не использовать некоторые RAW-запросы.


person Hardist    schedule 04.02.2017    source источник
comment
$payment->transactions()->delete(); вам не подходит?   -  person Ohgodwhy    schedule 04.02.2017
comment
Это фактически удаляет всю запись из базы данных, или я делаю что-то не так. Проверю снова.   -  person Hardist    schedule 05.02.2017
comment
Согласно документации Laravel (https://laravel.com/docs/5.4/eloquent-relationships#updating-belongs-to-relationships) вы можете использовать метод dissociate, чтобы разъединить все отношения, которые вам не нужны.   -  person zgabievi    schedule 05.02.2017
comment
К сожалению, это тоже не работает, пробовал. Просто говорит, что это неизвестный метод. И я просто нигде не могу найти ничего о detaching или disociating полиморфном отношении.   -  person Hardist    schedule 05.02.2017


Ответы (1)


Комментарий пользователя @zgabievi правильный. dissociate() существует с версии 5.0. Вот коммит, который добавил его в отношение MorphTo: https://github.com/laravel/framework/commit/3d6727e1764c37e1219b0a1fc7e003ef61615434#diff-4c052acf0022213a4cc23f53ba42720e

Я использовал этот метод, чтобы отделить записи полиморфных файлов от их родительской модели. Поскольку он находится в MorphTo, для дочернего элемента вызывается метод dissociate().

Пример:

$attachment = new Attachment; // contains 'attachable' morphTo relationship

$note = new Note; // contains morphyMany relationship to Attachment

// save the Attachment through the attachments relationship, sets morph fields and persists to the database
$note->attachments()->save($attachment);

// populate the morph fields without saving
$attachment->attachable()->associate($note);

// clear the morph fields without saving
$attachment->attachable()->dissociate();
person Trip    schedule 16.01.2020