引言
接着我们的Laravel内容讲解,本篇讲一讲如何在模型创建新的数据条目后,获取条目的ID编号。这样在需要实时返回数据ID的场景下比较节约时间,不需要二次查询。
![bc8dafba278d7d8a430cfc0f1f5b2eaa.png](https://i-blog.csdnimg.cn/blog_migrate/c1fb77de9a3c7b6337061fd0a88ba731.jpeg)
学习时间
为了模拟实际编程情况,我们使用以下代码。比如有一个CRM系统,需要用户输入上报公司信息之后,通过API接口返回提示信息。
![ad91eb6895bda66e8353adceb59372aa.png](https://i-blog.csdnimg.cn/blog_migrate/a62543aeae34b94a995ee0e87d78d231.jpeg)
代码比较简单,知识将 request 的 input 内容复制给 Company 模型的属性,然后调用 save 方法将数据存入。
那么,如果想要获取存入后数据条目的ID,如何返回呢?
其实,save 方法本身就是链式调用的,会返回当前的 Company 模型对象。直接调用属性值即可:
$data->id;
封装到 Response 响应体内:
return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
上面的写法自然是对的,返回的是当前写入的条目的ID。但是,如果是并发的系统,或者在流程处理中,没有使用 Company 模型进行数据操作,而是 DB::statement,DB::insert 这些,获取到的,可就不是最后的ID了。
兼容的写法,需要考虑多用户并发操作,以及数据更新源不同的情况。那么需要使用独立的方式:
DB::getPdo()->lastInsertId();
这样就可以了,基本上不会出错。
非标准写法
上一节中,如果你的应用程序设定为必须在模型内插入数据,那么使用属性获取最后的ID,是可以的。但是不能保证绝对没错。lastInsertId() 函数正好中立而稳定。
说了标准写法,再说一种非标准,也不是最佳实践的代码,给各位提个醒:
$id = DB::table('users')->insertGetId([ 'email' => 'john@example.com', 'votes' => 0]);
这样的写法一时爽,bug调试火葬场!出故障的时候,你连 user 表的字段在什么时间,由那段程序触发的都定位不到。
写在最后
本文通过3个写法,演示了获取最近插入条目的数据库ID。我们提倡 lastInsertId() 方式,独立处理;坚决不提倡“非标准写法”,那将会是应用程序的巨大的坑。
Happy coding :-)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。