Laravel 5.6中如何让Save()方法正确返回True或False?
解决你的注册方法总是返回false的问题
嘿,我明白你遇到的困扰了——你的注册方法现在不管字段内容是否合规,都一个劲返回false,核心原因是Laravel的Eloquent模型在字段验证失败(比如长度超出限制)时,默认不会抛出异常,只是返回false,所以你的try/catch根本抓不到这种验证错误,而代码在try块结束后又没有返回true的逻辑,最后函数默认就返回false了。
下面给你两种可行的解决方案,按需选择:
方案一:手动添加验证(更灵活可控)
在保存数据前先手动验证字段是否符合规则,和数据库的约束对齐,这样能提前拦截错误,避免走到数据库层面:
public function register() { $user = new User; $user->fields = 'example'; $user->fieldWithError = 'Example exceeds characters DB'; // 定义验证规则,和数据库字段的长度限制严格匹配 $validator = \Illuminate\Support\Facades\Validator::make( $user->getAttributes(), [ 'fieldWithError' => 'required|max:10', // max:10对应数据库的string(10) // 可以在这里补充其他字段的验证规则 ] ); // 如果验证失败,直接返回false if ($validator->fails()) { return false; } try { // 验证通过后尝试保存,成功返回true,失败返回false return $user->save(); } catch (\Exception $e) { // 处理数据库连接、权限不足这类意外异常,同样返回false return false; } }
方案二:利用Eloquent模型的自动验证(更简洁)
如果你已经给User模型配置了验证规则(比如使用ValidatesWhenCreating trait,或者在模型里定义$rules属性),可以直接简化代码:
public function register() { $user = new User; $user->fields = 'example'; $user->fieldWithError = 'Example exceeds characters DB'; try { // save()会自动触发模型验证,成功返回true,验证失败返回false return $user->save(); } catch (\Exception $e) { // 捕获非验证类的异常,比如数据库连接错误 return false; } }
关键逻辑说明
- 原代码总是返回false的本质:当字段长度不符合要求时,
save()仅返回false,不会抛出异常,所以不会进入catch块;而try块执行完后没有任何return语句,函数默认返回false。 - 验证规则要和数据库约束保持一致(比如
max:10对应数据库的string('fieldWithError', 10)),这样能在应用层提前拦截错误,减少数据库层面的无效操作。 - try/catch在这里的作用是处理非验证类的意外异常,比如数据库连接失败、权限不足等,而不是字段验证错误。
内容的提问来源于stack exchange,提问作者Helder Ferrari
相关产品推荐
相关产品推荐

