2014-08-28 80 views
13

爲了保持我的編碼風格的一致性,我想使用camelCase來訪問屬性而不是snake_case。這在Laravel中可能沒有修改核心框架?如果是這樣,怎麼樣?如何使用駱駝案例訪問屬性?

例子:

// Database column: first_name 

echo $user->first_name; // Default Laravel behavior 
echo $user->firstName; // Wanted behavior 

回答

15

創建自己的BaseModel類並覆蓋下列方法。確保您的所有其他型號extend您的BaseModel

class BaseModel extends Eloquent { 

    // Allow for camelCased attribute access 

    public function getAttribute($key) 
    { 
     return parent::getAttribute(snake_case($key)); 
    } 

    public function setAttribute($key, $value) 
    { 
     return parent::setAttribute(snake_case($key), $value); 
    } 

} 

然後對用法:

// Database column: first_name 

echo $user->first_name; // Still works 
echo $user->firstName; // Works too! 

這招圍繞着強迫的關鍵是蛇的情況下通過重寫Model使用的魔術方法。

+2

我敢肯定你已經看到http://laravelsnippets.com/ – 2014-08-29 00:54:37

+4

你也不得不延長__isset()和__unset()方法。否則isset(),empty()和unset()函數將無法正確使用駱駝事件鍵。我在這個bug上花了半天的時間。 – jaaksarv 2015-11-17 16:01:30

+0

尋找這個像地獄兄弟謝謝! :D – 2017-10-03 05:02:19

10

由於SO不允許在評論中粘貼代碼片段,因此我將此發佈爲新答案。

爲了確保急切的加載不會中斷,我必須修改@ Lazlo的答案。當通過不同的密鑰訪問急切加載的關係時,它們將被重新加載。

<?php 

class BaseModel extends Eloquent 
{ 

    public function getAttribute($key) 
    { 
     if (array_key_exists($key, $this->relations)) { 
      return parent::getAttribute($key); 
     } else { 
      return parent::getAttribute(snake_case($key)); 
     } 
    } 

    public function setAttribute($key, $value) 
    { 
     return parent::setAttribute(snake_case($key), $value); 
    } 
} 
+0

你能解釋一下你在這裏解決的問題嗎?我不是真的遵循你在關係數組上做的驗證嗎? – 2016-08-05 20:06:25

+2

假設你運行查詢「User :: with('likedPosts')',它將被存儲爲''user-> attributes ['likedPosts']''。然而,當你重載''getAttribute''並將所有內容都改成snake_case時,當你編寫''user-> likedPosts''時,它會嘗試訪問''user-> attributes ['liked_posts']'',不存在。然後laravel會懶惰地加載關係,即使關係已經被加載(作爲favoritePosts)。爲了防止這種情況,「if」語句是必要的。 – 2016-08-07 11:48:07

+0

哦,我現在明白了......非常感謝您的幫助! ;) – 2016-08-07 20:19:52