2012-02-03 6 views
4

Есть ли простой способ добавления настраиваемых полей в модель? Скажем, у меня есть таблица «пользователь» с тремя полями: id, name и surname. Я хочу это:Yii: добавление пользовательских полей

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

Пожалуйста, обратите внимание: Я хочу, чтобы этот обычай поле будет добавлено через SQL, как чего-л

$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>'; 
    } 
+0

Довольно Hacky решение, хотя ... Я не думаю, что изменения вручную мета данных является хорошим стилем. – zapadlo

ответ

9

Вы можете добавить функцию к классу пользователя:

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

Это возвращает полное имя, как если бы это был атрибут из базы данных. Это намного проще, чем добавление вычисленного столбца в SQL.

+0

С помощью методов __get Yii вы можете вызвать эту функцию так же, как и обычный столбец: '$ user-> fullName' – thaddeusmt

+0

Когда вы пишете что-то вроде' $ user-> fullName', fullName может быть частью $ user для несколько разных причин. Он может быть переменной-членом активной записи пользователя, это может быть столбец в таблице User, это может быть имя отношения, которое имеет Пользователь, это может быть функция-член с именем getFullName(). Я думаю, что это все и в порядке, в котором они проверяются. –

+1

Перевод $ user-> fullName в $ user-> getFullName() является частью CComponent, базового класса для всех классов Yii. Для ActiveRecord выполняются дополнительные проверки атрибутов/отношений. FIRST: http://code.google.com/p/yii/source/browse/tags/1.1.9/framework/db/ar/CActiveRecord.php#133. – marcovtwout

0

В модели

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

Таким образом, не рекомендуется

Смежные вопросы