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().

丢弃更改

希望对您有所帮助!