laravel中主模型ID的示例分析

  介绍

小编给大家分享一下laravel中主模型ID的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

laravel是什么

laravel是一套简洁,优雅的PHP Web开发框架。它可以让你从面条一样杂乱的代码中解脱出来,它可以帮你构建一个完美的网络应用,而且每行代码都可以简洁,富于表达力。

<强>项目环境

老系统(linux + laravel5.6 + php7.2 + mysql5.7)

升级后新系统(linux + laravel5.8 + php7.2 + mysql5.7)

只单纯升级了laravel框架版本,并无升级其他相关服务依赖。

但是却出现大量的SQL执行错误,异常监控如下:

 laravel中主模型ID的示例分析

<强>分析过程

导致这段服务出错的是这样的一段业务逻辑、下面通过一段演示来模拟。

 laravel5.6:
  ,,,dd(主→美元id);//10002
  laravel5.8:
  ,,,dd(主→美元id),,//空

在5.6中保存中的数据还能正常获取到id,在5.8中怎么就不行了呢,于是马上去查看了laravel5.8的发行说明,也没有发现对主模型取消获取自增id的改动,于是开始进行5.8源码查阅…

首先对5.6和5.8的firstOrCreate函数进行了对比,发现无改动,代码逻辑执行无误。

 laravel中主模型id的示例分析

然后继续翻阅模型→保存()函数的代码

,发现不存在的数据是通过insertAndSetId该函数插入数据并设置主键id

 laravel中主模型id的示例分析

但insertAndSetId函数又是通过递增这样的一个成员属性来控制的,属性的默认值是真正的

 laravel中主模型id的示例分析

当这个属性变更时就不会执行者一步骤,难道这个成员属性在被操作过了?

于是立马查看了5.8的主模型源码。

 laravel中主模型ID的示例分析

最终发现是5.8的在中间表主类默认将递增设置成了假的,所以数据被成功插入,但是没有设置插入后的主键ID,造成剩余服务崩溃,没能正常运行……

<>强修复方案

在每个主类中重新覆盖掉递增属性值为真即可。

 laravel5.8:
  ,,,dd(主→美元id),,//10003 

以上是“laravel中主模型id的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

laravel中主模型ID的示例分析