Проверка сохранения Laravel/Eloquent с отношениями родитель / потомок

У меня есть родительская модель, которая никогда не должна существовать без хотя бы одного связанного отношения hasMany. Я пытаюсь написать валидацию для модели, чтобы убедиться, что этого никогда не произойдет.

public static function boot()
{
    parent::boot();
        // reject model with no children
        if (count($workflow->children) === 0) {
            throw new RuntimeException("need at least one child");
        }
    });
}

Но теперь у меня проблема с курицей и яйцом. Я не могу написать дочернюю запись без родительского идентификатора. И я не могу написать родительскую запись, пока не пройдет проверка сохранения. Но когда я пытаюсь связать детей и вызвать ->push() на родительской модели, у меня возникают различные проблемы в зависимости от того, как я пытаюсь связать их.

Следующее вызывает ошибку ограничения FK для дочернего столбца, который ссылается на родительский:

$parent->children->add($child);
$child->parent()->associate($parent);
$parent->push();

Является ли Laravel слишком глупым, чтобы справиться с этим (на первый взгляд разумным) вариантом использования?

1 ответ

Решение

Используйте Laravel's DB::beginTransaction(), DB::commit() а также DB::rollback() функции, предотвращающие сохранение любой ложной информации в базе данных. Возьмите следующий пример:

public function save(){
  DB::beginTransaction();
  try {
    $parent = new Parent();
    $parent->save();
    $child = new Child();
    $parent->children()->save($child);
    DB::commit();
  } catch(Exception $e()) {
    Log::error($e->getMessage());
    DB::rollback();
  }
}

В основном, используя try { ... } catch() { ... } блокировать с DB::beginTransaction(), DB::commit() а также DB::rollback(), вы можете попытаться сохранить что-то в базе данных, и если нет исключений, DB::commit() перемены. Если что-то идет ужасно, ужасно не так, и исключение будет обнаружено, сообщение об ошибке будет зарегистрировано, и изменения будут отклонены с помощью DB::rollback(),

Надеюсь, это поможет!

Другие вопросы по тегам