Обработка круговых мягких удалений для двух моделей

#laravel #eloquent

Вопрос:

У меня есть две модели (Владелец и автомобиль), между которыми существуют отношения «один к одному». Обе модели используют мягкое удаление. Если какая-либо модель мягко удалена, она должна мягко удалить свое отношение.

В настоящее время, когда Владелец удален, я использую события для удаления автомобиля:

Приложение/Модели/Владелец

 protected static function booted() {  static::deleted(function ($owner) {  $owner-gt;car-gt;delete();  });   static::restored(function ($owner) {  $owner-gt;car()-gt;withTrashed()-gt;first()-gt;restore();  }); }  

Это прекрасно работает, но я не могу понять, как сделать то же самое из автомобиля, не сталкиваясь с круговой логикой. Я попытался добавить логический тест для $car-gt;owner или $car-gt;owner()-gt;trashed() , но в обоих случаях страница просто зависает — предположительно, поскольку методы идут по кругу.

Как я могу добиться желаемого поведения?

Ответ №1:

Похоже, что было бы проще использовать наблюдателя для каждой модели, который следит за ее удалением — при удалении проверьте, удалена ли уже связанная модель, и если нет, удалите ее (бит «если нет» предотвратит проблему цикличности, с которой вы, похоже, сталкиваетесь).