gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:37:31 25 4
gpt4 key购买 nike

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

问题 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com