小編給大家分享一下laravel中Pivot模型ID的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計,長沙縣網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:長沙縣等地區(qū)。長沙縣做網(wǎng)站價格咨詢:18980820575
Laravel 是一套簡潔、優(yōu)雅的PHP Web開發(fā)框架。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你構(gòu)建一個完美的網(wǎng)絡(luò)APP,而且每行代碼都可以簡潔、富于表達(dá)力。
項目環(huán)境
老系統(tǒng)(linux + laravel5.6 + php7.2 + MySQL5.7)
升級后新系統(tǒng)(linux +laravel5.8 + php7.2 + mysql5.7)
只單純升級了laravel框架版本,并無升級其他相關(guān)服務(wù)依賴.
但是卻出現(xiàn)大量的SQL執(zhí)行錯誤,異常監(jiān)控如下:
分析過程
導(dǎo)致這段服務(wù)出錯的是這樣的一段業(yè)務(wù)邏輯,下面通過一段demo來模擬.
$pivot = UserRole::firstOrCreate([ 'user_id' => 3, 'role_id' => 3, ]); $this->addRoleHistory($user,$pivot->id); dd($pivot->id);
在laravel5.6版本中這段代碼運行起來毫無問題,但升級到5.8版本中就會引發(fā)大量的SQL執(zhí)行錯誤,就像下面這樣.
laravel5.6: dd($pivot->id); //10002 laravel5.8: dd($pivot->id); //null
在5.6中保存中的數(shù)據(jù)還能正常獲取到ID,在5.8中怎么就不行了呢,于是馬上去查看了laravel5.8的發(fā)行說明,也沒有發(fā)現(xiàn)對Pivot模型取消獲取自增ID的改動,于是開始進行5.8源碼查閱。。。
首先對5.6和5.8的firstOrCreate函數(shù)進行了對比,發(fā)現(xiàn)無改動,代碼邏輯執(zhí)行無誤。
然后繼續(xù)翻閱model->save()函數(shù)的代碼
,發(fā)現(xiàn)不存在的數(shù)據(jù)是通過insertAndSetId該函數(shù)插入數(shù)據(jù)并設(shè)置主鍵ID
但insertAndSetId函數(shù)又是通過incrementing這樣的一個成員屬性來控制的,屬性的默認(rèn)值是true
當(dāng)這個屬性變更時就不會執(zhí)行者一步驟,難道這個成員屬性在被操作過了?
于是立馬查看了5.8的pivot模型源碼.
最終發(fā)現(xiàn)是5.8的在中間表Pivot Class默認(rèn)將incrementing設(shè)置成了false,所以數(shù)據(jù)被成功插入,但是沒有設(shè)置插入后的主鍵ID,造成剩余服務(wù)崩潰,沒能正常運行...
修復(fù)方案
在每個Pivot Class中重新覆蓋掉incrementing屬性值為true即可.
class UserRole extends Pivot { public $incrementing = true; protected $fillable = [ 'user_id', 'role_id', ]; }
修復(fù)后:
laravel5.8: dd($pivot->id); //10003
以上是“l(fā)aravel中Pivot模型ID的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!