【问题标题】:Yii: adding custom fieldsYii:添加自定义字段
【发布时间】:2012-02-03 19:25:47
【问题描述】:

有向模型添加自定义字段的简单方法吗?假设我有一个包含 3 个字段的表“用户”:id、name 和 surname。我想要这个:

$user = User::model()->findByPk(1);
$echo $user->fullName; // echoes name and surname

请注意:我希望通过 sql 添加这个自定义字段,smth like

$c = new CDbCriteria();
$c->select = 'CONCAT("user".name, "user".surname) as fullName'; 
$user = User::model()->find($c);

问题是未设置 fullName 属性。

UPD:

这里是一个有点棘手的问题的代码——来自另一个表的自定义字段。这样做是这样的:

    $model = Application::model();
    $model->getMetaData()->columns = array_merge($model->getMetaData()->columns, array('fullName' => 'CONCAT("u".name, "u".surname)'));

    $c = new CDbCriteria();
    $c->select = 'CONCAT("u".name, "u".surname) as fullName';
    $c->join = ' left join "user" "u" on "t".responsible_manager_id = "u".id';

    $model->getDbCriteria()->mergeWith($c);

    foreach ($model->findAll() as $o) {
        echo '<pre>';
        print_r($o->fullName);
        echo '</pre>';
    }

【问题讨论】:

  • 虽然是相当老套的解决方案...我不认为手动更改元数据是好的风格。

标签: yii custom-attributes


【解决方案1】:

您可以在 User 类中添加一个函数:

public function getFullName() { return $this->name.' '.$this->surname; }

这将返回全名,就好像它是数据库中的一个属性一样。这比在 SQL 中添加计算列要容易得多。

【讨论】:

  • 使用 Yii 的 __get 方法,您也可以像调用常规列一样调用该函数:$user-&gt;fullName
  • 当你写像$user-&gt;fullName 这样的东西时,fullName 可以是 $user 的一部分,原因有几个。它可以是 User 活动记录的成员变量,可以是 User 表中的列,可以是 User 拥有的关系的名称,也可以是名为 getFullName() 的成员函数。我认为这就是全部,并且按照检查的顺序。
  • 将 $user->fullName 转换为 $user->getFullName() 是 CComponent 的一部分,它是所有 Yii 类的基类。对于 ActiveRecord,首先完成额外的属性/关系检查:code.google.com/p/yii/source/browse/tags/1.1.9/framework/db/ar/…
【解决方案2】:

在模型中

public function getMetaData(){
        $data = parent::getMetaData();
        $data->columns['fullName'] = array('name' => 'fullName');
        return $data;
    }

因此不推荐

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多