【问题标题】:Laravel 4 - Model properties' names different than database columnsLaravel 4 - 模型属性的名称与数据库列不同
【发布时间】:2014-03-07 21:05:27
【问题描述】:

我有一个问题,这似乎是合乎逻辑的,但我找不到答案。 假设我有模型任务:

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

所以,我有一个属性is_done,但是在处理应用程序的前端和后端部分时,我希望将isDone 作为模型属性。 有没有办法对框架说,以某种方式为我重新打包?这样我就可以在整个应用程序中使用isDone,并且该模型负责在保存/更新时将其转换为is_done

这会对我有所帮助,因此我不必考虑在数据库中指定的名称(例如在传统 SQL 子句中使用别名时)。

这可能吗?有意义吗?

【问题讨论】:

标签: laravel-4 eloquent


【解决方案1】:

为防止为模型的每个属性编写 getter/setter 方法,您可以覆盖 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);
  }
}

【讨论】:

  • 你救了我的灵魂……好人!我认为 iw 将不得不使用框架自定义 getPropertyAttr($value)
【解决方案2】:

你的属性的getter方法对你有帮助吗?如果是:

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

如果没有,并且您确实需要访问 $Task->isDone:尝试覆盖 $key == 'isDone'(可能还有其他属性)的魔术 _get() 方法中的 $key 并返回父级::_get() 和 $key:

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

也许,您的 Eloquent 需要一个用于属性魔术方法的属性映射器;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多