Проверка сохранения 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()
,
Надеюсь, это поможет!