爲了保持我的編碼風格的一致性,我想使用camelCase
來訪問屬性而不是snake_case
。這在Laravel中可能沒有修改核心框架?如果是這樣,怎麼樣?如何使用駱駝案例訪問屬性?
例子:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
爲了保持我的編碼風格的一致性,我想使用camelCase
來訪問屬性而不是snake_case
。這在Laravel中可能沒有修改核心框架?如果是這樣,怎麼樣?如何使用駱駝案例訪問屬性?
例子:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
創建自己的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
使用的魔術方法。
由於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);
}
}
你能解釋一下你在這裏解決的問題嗎?我不是真的遵循你在關係數組上做的驗證嗎? – 2016-08-05 20:06:25
假設你運行查詢「User :: with('likedPosts')',它將被存儲爲''user-> attributes ['likedPosts']''。然而,當你重載''getAttribute''並將所有內容都改成snake_case時,當你編寫''user-> likedPosts''時,它會嘗試訪問''user-> attributes ['liked_posts']'',不存在。然後laravel會懶惰地加載關係,即使關係已經被加載(作爲favoritePosts)。爲了防止這種情況,「if」語句是必要的。 – 2016-08-07 11:48:07
哦,我現在明白了......非常感謝您的幫助! ;) – 2016-08-07 20:19:52
我敢肯定你已經看到http://laravelsnippets.com/ – 2014-08-29 00:54:37
你也不得不延長__isset()和__unset()方法。否則isset(),empty()和unset()函數將無法正確使用駱駝事件鍵。我在這個bug上花了半天的時間。 – jaaksarv 2015-11-17 16:01:30
尋找這個像地獄兄弟謝謝! :D – 2017-10-03 05:02:19