2013-10-30 67 views
0

我有一個問題,這似乎是合乎邏輯的,但我無法找到答案。 比方說,我有型號任務:Laravel 4 - 模型屬性的名稱不同於數據庫列

class Task extends Eloquent { 
    protected $fillable = array('is_done'); 
} 

所以,我有一個屬性is_done,但在應用程序的前端和後端部分工作時,我想有isDone作爲模型屬性。 有沒有辦法對框架說出來,以某種方式爲我重新包裝它?因此,我可以在整個應用程序中使用isDone,並且該模型負責將其轉換爲is_done,用於保存/更新。

這會幫助我,所以我不必考慮數據庫中指定的名稱(例如在傳統SQL子句中使用別名時)。

這可能嗎?是否有意義?

+0

它看起來這是一個答案,沒有內置的替代 http://stackoverflow.com/questions/19571167/in- laravel-how-to-use-snake-case-for-database-table-columns-and-camel-case-for-m#answer-19572162 – Ned

回答

0

你屬性的getter方法能幫助你嗎?如果是的話:

<?php 
class Task extends Eloquent { 
    public function isDone() 
    { 
     return $this->getAttribute('is_done'); 
    } 
} 

如果沒有,你真的需要訪問$任務 - > isDone:試圖覆蓋在魔術的$ _關鍵得到$鍵==「isDone」()方法(可能其他屬性),並返回母:: _get()與$鍵:

<?php 
class Task extends Eloquent { 
    public function __get($key) 
    { 
     if($key == 'isDone') 
      $key = 'is_done'; 
     return parent::__get($key); 
    } 
} 

也許,你雄辯需要爲屬性的魔術方法的屬性映射器;)

1

爲防止寫入一個getter/setter方法爲模型的每一個屬性,你可以覆蓋t從Eloquent類魔法,他的方法來訪問它們在駝峯風格:

class Model extends Eloquent { 
    public function __get($key) 
    { 
    $snake_key = snake_case($key); 
    return parent::__get($snake_key); 
    } 

    public function __set($key, $value) 
    { 
    $snake_key = snake_case($key); 
    parent::__set($snake_key, $value); 
    } 

    public function __isset($key) 
    { 
    $snake_key = snake_case($key); 
    return parent::__isset($snake_key); 
    } 

    public function __unset($key) 
    { 
    $snake_key = snake_case($key); 
    parent::__unset($snake_key); 
    } 
} 
+0

你救了我的靈魂人....好的!我以爲iw將不得不使用框架自定義getPropertyAttr($ value) – Jimmyt1988

相關問題