我有一个父模型,如果没有至少一个关联的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");
}
});
}
但现在我有鸡和蛋的问题。没有父ID,我无法编写子记录。在保存验证通过之前,我无法编写父记录。但是当我尝试关联孩子并在父模型上调用 - > push()时,我会遇到各种问题,具体取决于我如何将两者联系起来。
以下导致引用父项的子列上的FK约束失败:
$parent->children->add($child);
$child->parent()->associate($parent);
$parent->push();
Laravel是否太愚蠢无法处理这个(看似合理的)用例?
答案 0 :(得分:3)
使用Laravel的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()
的{{1}}块,您可以尝试将某些内容保存到数据库中,如果没有捕获异常,{{ 1}}变化。如果出现可怕的情况,非常错误,并且将捕获异常,将记录错误消息并使用DB::rollback()
丢弃更改。
希望有所帮助!