首页 文章

Laravel / Eloquent使用父/子关系保存验证

提问于
浏览
2

我有一个父模型,如果没有至少一个关联的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是否太愚蠢无法处理这个(看似合理的)用例?

1 回答

  • 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();
      }
    }
    

    基本上,使用带有 DB::beginTransaction()DB::commit()DB::rollback()try { ... } catch() { ... } 块,您可以尝试将某些内容保存到数据库中,如果没有捕获异常, DB::commit() 更改 . 如果出现可怕的情况,非常错误,并且将捕获异常,将记录错误消息并使用 DB::rollback() 丢弃更改 .

    希望有所帮助!

相关问题