#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:
Похоже, что было бы проще использовать наблюдателя для каждой модели, который следит за ее удалением — при удалении проверьте, удалена ли уже связанная модель, и если нет, удалите ее (бит «если нет» предотвратит проблему цикличности, с которой вы, похоже, сталкиваетесь).