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

时间:2015-03-10 19:36:00

标签: laravel eloquent 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是否太愚蠢无法处理这个(看似合理的)用例?

1 个答案:

答案 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()丢弃更改。

希望有所帮助!