Laravel 關聯模型因名稱一致性而導致的問題 laravel 影片教學 thinkphp php laravel

WBOY
發布: 2016-07-29 08:50:02
原創
1423 人瀏覽過

1. 定義關聯模型

在Laravel裡面,我們可以透過定義以下Model來完成關聯查詢。

class MyPost extends Eloquent { public function myPostInfo () { return $this->hasOne('MyPostInfo'); } } class MyPostInfo extends Eloquent {}
登入後複製

2. 使用關聯模型

這裡myPostInfo()用的是Camel命名規則,但是我們在讀取某一個PostInfo的時候可以用Snake規則。如下面程式碼都是可行的:myPostInfo()用的是Camel命名规则,但是我们在读取某一个PostInfo的时候可以用Snake规则。如下面代码都是可行的:

$post = MyPost::find(1); $post_info = $post->myPostInfo; // example 1 $post_info = $post->my_post_info; // example 2
登入後複製

Laravel允许上述两种方法,但是没有合理的处理使用两种命名造成的冲突。

3. 缓存失效

如果我们同时使用了上述两个例子,就会使其中一个缓存失效。在Model的relations变量中,缓存了已经读取过的关联Model,但是当我们用不同规则的名字去读取的时候,却会使得前一个缓存失效。例如

$post_info = $post->myPostInfo; // $post->relations = [‘myPostInfo’ => ..]; $post_info = $post->my_post_info; // $post->relations = [‘myPostInfo’ => …, ‘my_post_info’ => …];
登入後複製

所以如果不希望缓存失效,得在项目中只使用一种命名方法去读取关系模型。Laravel推荐的是Camel Case.

4. toArray() 方法失效

如果同时使用了两者,另外一个问题就是导致Model::toArray()失效。因为toArray()方法首先去relations中查找Snake Case命名的关联模型,没有的话才去看Camel Case的。

所以如果用到了toArray()

MyPost::with(‘myPostInfo’)->get();
登入後複製
Laravel允許上述兩種方法,但是沒有合理的處理使用兩種命名造成的衝突。

3. 快取失效

如果我們同時使用了上述兩個例子,就會使其中一個快取失效。在Model的relations變數中,快取了已經讀取過的關聯Model,但是當我們用不同規則的名字去讀取的時候,卻會讓前一個快取失效。例如

$my_post->myPostInfo;
登入後複製
所以如果不希望快取失效,得在專案中只使用一種命名方法去讀取關係模型。 Laravel推薦的是Camel Case.

4. toArray() 方法失效

如果同時使用了兩者,另一個問題就是導致 Model::toArray()失效。因為 toArray()方法先去 relations找找Snake Case命名的關聯模型,沒有的話才去看Camel Case的。

所以如果用到了 toArray()方法來轉換Model,切忌同時使用兩者。 5. 容易犯錯的位置最容易犯錯的程式碼是這樣的:rrreee在使用With去eagerLoad關聯模型時,必須使用和定義方法同名的key去讀取,那麼這樣讀取出來的方法只能是Camel Case的key。其他地方就只能用rrreee來保證不出問題。 以上就介紹了Laravel 關聯模型由於名稱一致性導致的問題,包括了laravel方面的內容,希望對PHP教程有興趣的朋友有所幫助。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!