你还在为是否需要「判断数据库操作返回值」而烦恼吗?

结论要放最前面

不用判断

前盐🧂

查询构造器Eloquent ORM 几乎是我们在 Laravel 中必用的数据库操作工具。

但很多时候我们在其使用方法上会产生疑问或歧义。

这是社区部分话题里存在的疑问:

这是官方文档ORM 相关方法的使用示例:

// save()
$flight = new Flight;
$flight->name = $request->name;
$flight->save();

// create()
$flight = Flight::create([
    'name' => 'London to Paris',
]);

// update()
Flight::where('active', 1)
      ->where('destination', 'San Diego')
      ->update(['delayed' => 1]);

但是文档上并没有说明是否需要对其返回值做判断。

至于为什么不用判断,先看下 Laravel 作者 Taylor Otwell 的解释,后面有更多案例!

解释

Model::create return false on failure by anlutro · Pull Request #3107 · laravel/framework (github.com)

[5.3] Update Model save() to return true on non-error by davidrushton · Pull Request #15236 · laravel/framework (github.com)

这个 PR 还修改了 Model save() 的返回值

总结

作者的回复已经很明确,这里要说明下特殊情况:

  1. 如果使用的是查询构造器的 update(), 其返回值是受影响的行数,可能为 0;
  2. 如果在模型事件(creating、saving、updating 等)中返回 false,save() 会取消操作并返回 false;

以上情况可以根据业务需要自行判断,对于第二种情况,作者在上面的 PR 里其实也有回复

另外,很多人说用 try catch,为什么要手动处理?项目里没有异常处理机制?

案例(大量截图)

Laravel 官方项目

Laravel Breeze

breeze/NewPasswordController.php · laravel/breeze (github.com)

breeze/PasswordController.php · laravel/breeze (github.com)

Laravel Cashier

cashier-stripe/ManagesCustomer.php · laravel/cashier-stripe (github.com)

cashier-stripe/Subscription.php · laravel/cashier-stripe (github.com)

Laravel Jetstream

jetstream/CreateNewUserWithTeams.php · laravel/jetstream (github.com)

jetstream/Team.php · laravel/jetstream (github.com)

Laravel Sanctum

sanctum/HasApiTokens.php · laravel/sanctum (github.com)

sanctum/Guard.php · laravel/sanctum (github.com)

Laravel Telescope

telescope/DatabaseEntriesRepository.php · laravel/telescope (github.com)

非官方 Laravel 系项目

Flarum(论坛)

framework/ValidatePost.php · flarum/framework (github.com)

framework/OrderTagsController.php · flarum/framework (github.com)

Deployer(应用程序部署系统)

deployer/ProfileController.php · REBELinBLUE/deployer (github.com)

deployer/EloquentUserRepository.php · REBELinBLUE/deployer (github.com)

结束

本帖已被设为精华帖!
本帖由 MArtian 于 1年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11

和linux理念一致,任何命令没有显式报出异常就是执行成功了,没有消息就是最好的消息

1年前 评论

和linux理念一致,任何命令没有显式报出异常就是执行成功了,没有消息就是最好的消息

1年前 评论

我从来不判断,除非有唯一索引等特殊情况。

1年前 评论
mowangjuanzi 1年前

我是不判断。

1年前 评论

借题请教下,如果返回的是json,按抛出异常来处理,是不是要单独接管异常输出?

1年前 评论
reiz568569 1年前

@____Laravel

如果请求头包含 Accept: application/json,异常处理会自动将响应转为 json

请求 vendor/laravel/framework/src/Illuminate/Http/Concerns/InteractsWithContentTypes.php

file

异常处理 vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php

file

如果你的项目是纯接口开发,可以参考 Wiki 在响应中设置始终返回 json

Laravel 响应:永远返回 JSON 响应

Laravel 响应:中间件实现返回 JSON 响应

1年前 评论
____Laravel 1年前
flc1125

文章不错,mark,另外针对 update() 后为 0 条的情况下,这点,如果业务逻辑需要,还是有必要判断的。

1年前 评论
lddtime (楼主) 1年前

我之前总是判断,后来就不判断了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!