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();
$my_post->myPostInfo;
Model::toArray()
失效。因為
toArray()
方法先去
relations
找找Snake Case命名的關聯模型,沒有的話才去看Camel Case的。
所以如果用到了
toArray()
方法來轉換Model,切忌同時使用兩者。 5. 容易犯錯的位置最容易犯錯的程式碼是這樣的:rrreee在使用With去eagerLoad關聯模型時,必須使用和定義方法同名的key去讀取,那麼這樣讀取出來的方法只能是Camel Case的key。其他地方就只能用rrreee來保證不出問題。 以上就介紹了Laravel 關聯模型由於名稱一致性導致的問題,包括了laravel方面的內容,希望對PHP教程有興趣的朋友有所幫助。