摘要:雖然在使用過(guò)程中應(yīng)該小心避免和撞上同名屬性,但偶爾還是會(huì)碰到的,這個(gè)還是稍微注意下就好,這并非,而是在當(dāng)前的程序處理方式下必然會(huì)產(chǎn)生的一個(gè)正常現(xiàn)象。
場(chǎng)景還原 UserModel
class UserModel extends Model { public function role() { return $this->belognsTo(RoleModel::class , "role_id" , "id"); } }出錯(cuò)的程序
$user = UserModel::with("role")->find(1); // $user->role 是一個(gè) RoleModel // 更新 role 屬性 $user->role = "test"; // 正確輸出 test var_dump($user->role); // 但是!!轉(zhuǎn)換成 json 字符串后 // 你會(huì)發(fā)現(xiàn),role 居然還是個(gè)模型!! // 并不是你后面設(shè)置成的 test ! // 怪胎,丟失更新了?Laravel Bug ?? // 實(shí)際上不是!請(qǐng)看下屬描述 var_dump(json_encode($user));原理概述
Laravel 的 IlluminateDatabaseEloquentModel 實(shí)現(xiàn)了 JsonSerializable 接口,所以在調(diào)用 json_encode 進(jìn)行序列化時(shí),會(huì)調(diào)用 Model::jsonSerialize 方法,他這個(gè)方法返回的數(shù)據(jù)是:
array_merge($attribute , $relation);
實(shí)際上你通過(guò):
$model->name = "grayVTouch";
這種方式附加的新屬性,Laravel 通過(guò) __set 魔術(shù)方法重載,將其添加到 attribute 數(shù)組中,你是無(wú)法更改 relation 數(shù)組的!
而通過(guò) 模型關(guān)聯(lián) 你卻可以為 relation 數(shù)組新增單元!
看到上面的數(shù)組合并方式,可以知道 relation 會(huì)覆蓋掉 attribute 中的同名屬性!!因而要特別注意:如果 relation 中有和 attribute 中同名的屬性,請(qǐng)修改 relation 關(guān)聯(lián)名稱!如果不想修改 relation 名稱,堅(jiān)持前者覆蓋后者,請(qǐng):
// 保存值 $attr = $model->attr; // 刪除屬性:attribute / relation 中的屬性(Laravel 內(nèi)部調(diào)用 __unset 魔術(shù)方法) unset($model->attr) // 重新設(shè)置值,僅設(shè)置到 attribute 數(shù)組 // relation 并不會(huì)被設(shè)置 $model->attr = $model;綜合評(píng)價(jià)
Laravel 由于將模型屬性拆分成兩個(gè)數(shù)組,而他們實(shí)際上又同屬于一個(gè)對(duì)象!所以如果存在同名屬性,必然會(huì)產(chǎn)生 誰(shuí)覆蓋誰(shuí) 的問(wèn)題,attribute 一開(kāi)始就是對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段的,而 relation 是后面程序附加的,為了不丟失更新,后者覆蓋前者,非常正確。
雖然在使用過(guò)程中應(yīng)該小心避免 relation 和 attribute 撞上同名屬性,但偶爾還是會(huì)碰到的~,這個(gè)還是稍微注意下就好,這并非 Bug,而是在當(dāng)前的程序處理方式下必然會(huì)產(chǎn)生的一個(gè)正常現(xiàn)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31147.html
摘要:但也因?yàn)閼?yīng)有盡有使得框架的性能比其他高性能框架低了些,為此給了幾個(gè)解決方案路由緩存經(jīng)有關(guān)部門(mén)研究,路由緩存可有效加快訪問(wèn)速度以上。有朋友說(shuō)框架最重要的東西是路由,我倒認(rèn)為最重要的是框架中異于其他框架且能解決痛點(diǎn)的東西,如的。 showImg(https://segmentfault.com/img/remote/1460000006767764); 在程序界的遠(yuǎn)古時(shí)期,大神們手持鍵盤(pán)敲...
摘要:很多程序員使用創(chuàng)建他們的應(yīng)用程序。是一個(gè)免費(fèi)開(kāi)源的應(yīng)用程序框架。是的模板語(yǔ)言,對(duì)藝術(shù)家友好,這個(gè)程序員的命令行工具可以在中工作使用插件和幫助器我們可以進(jìn)一步擴(kuò)展對(duì)應(yīng)用的支持。 很多PHP程序員使用 [laravel] 創(chuàng)建他們的應(yīng)用程序。[laravel] 是一個(gè)免費(fèi)開(kāi)源的PHP web應(yīng)用程序框架。它基于多個(gè)Symfony 組件,提供了一個(gè)開(kāi)發(fā)框架,包括authentication,...
摘要:重點(diǎn)是在頁(yè)面寫(xiě)入新文本,頁(yè)面不能實(shí)時(shí)顯示。想要了解更多可以參考這篇文章基于驅(qū)動(dòng)的事件廣播下測(cè)試實(shí)時(shí)功能刷新頁(yè)面,并觀察數(shù)據(jù)庫(kù)。測(cè)試實(shí)時(shí)創(chuàng)建功能。 說(shuō)明:本文主要來(lái)源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介紹該框架的實(shí)時(shí)通信功能,Laravel模型的生命周期中包含事件:created...
摘要:簡(jiǎn)介是一套簡(jiǎn)介,優(yōu)雅開(kāi)發(fā)框架,通過(guò)簡(jiǎn)單,高雅,表達(dá)式語(yǔ)法開(kāi)發(fā)應(yīng)用。服務(wù)器需要有該目錄及所有子目錄的寫(xiě)入權(quán)限可用于存儲(chǔ)應(yīng)用程序所需的一些文件該目錄下包括緩存和編譯后的視圖文件日志目錄測(cè)試目錄該目錄下包含源代碼和第三方依賴包環(huán)境配置文件。 簡(jiǎn)介 Laravel是一套簡(jiǎn)介,優(yōu)雅PHP Web開(kāi)發(fā)框架(PHP Web Framework), 通過(guò)簡(jiǎn)單,高雅,表達(dá)式語(yǔ)法開(kāi)發(fā)Web應(yīng)用。 特點(diǎn): ...
摘要:開(kāi)發(fā)根目錄測(cè)試分為單元測(cè)試和功能測(cè)試創(chuàng)建一個(gè)文件執(zhí)行測(cè)試測(cè)試前清除配置緩存運(yùn)行單個(gè)測(cè)試用例小提示在開(kāi)發(fā)與進(jìn)行交互的第三方擴(kuò)展包時(shí),最好選擇注入契約而不使用。 參考https://laravelacademy.org/ 概念 單詞 契約Contract 就是接口 repository 倉(cāng)庫(kù)(封裝數(shù)據(jù)訪問(wèn),可以搜索:repository模式) Container 容器 ServicePr...
閱讀 3306·2021-11-23 09:51
閱讀 2925·2021-10-28 09:33
閱讀 890·2021-10-08 10:04
閱讀 3693·2021-09-22 15:13
閱讀 1023·2019-08-30 15:55
閱讀 2912·2019-08-30 15:44
閱讀 571·2019-08-30 13:04
閱讀 2942·2019-08-30 12:56