2013-10-30 65 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

相关问题