laravel - save 与 saveorfail (简而言之,真正的区别)

标签 laravel laravel-5 eloquent laravel-4

我终于明白这个概念了,因为我仍然没有得到一些案例。

问题 1)save() 返回什么?它总是 bool 值还是有时会抛出异常?

问题 2) 我没有使用任何事件模型。所以我认为 save() 不会在任何时候返回 false。那么它会返回true还是抛出异常?我说得对吗?

问题 3) 如果我有这样的事情:

DB::beginTransaction();
try{
  $model1 = new Type();
  $model1->test = 'great';
  $model1->save();

  $model2 = new Type();
  $model2->test2 = 'awesome';
  $model2->save();
  DB::commit();
}catch(Exception $e){
  DB::rollBack();
}

是否有可能保存没有发生但没有抛出异常?我在这些模型中没有任何事件。

问题 4) 如果问题 3 的答案是“不,这是不可能的”,那么为什么我需要使用 saveOrFail()

我真的很感激,因为我真的找不到任何可以深刻解释我所问问题的内容。

最佳答案

问题1) save()确实可以抛出异常。例如,如果您创建一个带有小数列的模型,例如'cost',并尝试在该列中保存字符串值,save()saveOrFail() 都会抛出异常。演示:

>>> $item->cost = 'asdas';
>>> $item->save();
 Illuminate/Database/QueryException with message 'SQLSTATE[HY000]: General error: 1366 Incorrect decimal value: 'asdas' for column 'cost' at row 1 (SQL: update ...

问题 2) 浏览 source ,看起来 save() 在触发 saving update 时只会返回 false创建事件返回false

由于您尚未定义任何事件监听器,理论上是的,您应该只接收 true ,否则将引发异常。

问题 3) 如果您没有监听事件,那么这是不可能的(至少不可能)。仅当抛出异常时,保存才不会发生。

问题 4) 由于 saveOrFail() 只是将 save() 包装在事务中,因此它的用途是保持数据库一致(如果有)在 save() 函数期间引发异常。 saveOrFail() 确保如果在 save() 期间引发任何异常,模型将不会被保存。如果抛出异常,单独的 save() 无法保证模型不会被修改/保存。

由于您已经将代码包装在事务中,因此不需要使用 saveOrFail

对于您的用例,我能想到的最好的方法是在单个 if 表达式中对所有模型调用 save() ,并且仅当表达式为 时才提交事务>真实。这样,您就可以在 save() 返回 false 或引发异常时同时满足这两种情况。像这样:

DB::beginTransaction();
try {
  $model1 = new Type();
  $model1->test = 'great';
  
  $model2 = new Type();
  $model2->test2 = 'awesome';
  
  if ($model1->save() && $model2->save()) {
    DB::commit();
  } else {
    DB::rollBack();
  }
} catch(Exception $e){
  DB::rollBack();
}

关于laravel - save 与 saveorfail (简而言之,真正的区别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57494581/

相关文章:

php - 你能在不使用 Laravel 5 在数据库中创建条目的情况下填充 Eloquent 模型吗

authentication - Laravel 4 密码确认似乎没有按照我的预期工作

php - laravel 查询 - 调用未定义的属性 - 集合

php - 如何在 Laravel 4 中执行构造函数注入(inject)依赖项?

php - Laravel save() - 插入数据而不是更新

javascript - 有没有办法用 php 检查 url 中的特定参数?

php - Laravel where - 如何使用条件引用相同的模式?

laravel - 更改 Laravel 加密中的密码

laravel - 查看 [layouts.default] 未找到 - Laravel

php - 如何在 Laravel Eloquent 中插入具有多个 belongsTo 关系的记录