Laravel/Eloquent 使用 parent/child 关系保存验证
Laravel/Eloquent save validation with parent/child relationships
我有一个父模型,如果没有至少一个关联的 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 处理这个(看似合理的)用例是不是太愚蠢了?
使用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();
}
}
基本上,使用带有 DB::beginTransaction()
、DB::commit()
和 DB::rollback()
的 try { ... } catch() { ... }
块,您可以尝试将某些内容保存到数据库中,如果没有捕获到异常, DB::commit()
变化。如果出现非常严重的错误,异常将被捕获,错误消息将被记录并使用 DB::rollback()
.
丢弃更改
希望对您有所帮助!
我有一个父模型,如果没有至少一个关联的 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 处理这个(看似合理的)用例是不是太愚蠢了?
使用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();
}
}
基本上,使用带有 DB::beginTransaction()
、DB::commit()
和 DB::rollback()
的 try { ... } catch() { ... }
块,您可以尝试将某些内容保存到数据库中,如果没有捕获到异常, DB::commit()
变化。如果出现非常严重的错误,异常将被捕获,错误消息将被记录并使用 DB::rollback()
.
希望对您有所帮助!