Вычисляемые атрибуты CActiveRecord

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

Вычисляемые атрибуты CActiveRecord

Сообщение Grigory »

Хочу сделать вычисляемый атрибут test в CActiveRecord. В таблице только поля 'id' int и 'name' varchar.
Класс:

Код: Выделить всё

  class Test extends CActiveRecord{
		public $test;
		
		public static function model($className=__CLASS__){
            return parent::model($className);
        }
		
		public function tableName(){
            return '{{'.strtolower(get_class($this)).'}}';
        }
		
		protected function afterFind(){
			$this->test='123';
		}
		
		public function rules(){
			return array(
				array('name, test', 'length', 'max'=>255),
			);
		}
	}
Класс формы:

Код: Выделить всё

class TestForm extends CFormModel{
		public $name;
		public $test;
		
		public function rules(){
			return array(
				array('name, test', 'length', 'max'=>255)
			);
		}
	}
Пишу:

Код: Выделить всё

$rcd=Test::model()->findByPk(1);
$model=new TestForm();
$model->setAttributes($rcd->attributes);
// в $model присвоились только id и name
После вызова Test::model()->findByPk(id), в атрибутах Test ($rcd->attributes) появляются только id=>'1' и 'name'=>'str1'. Атрибута 'test'=>'123' в них нет. В результате, после массового присвоения в TestForm заносятся только атрибуты 'id' и 'name'. Как можно занести поле test в атрибуты класса Test, чтобы они массово присваивались форме?
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: Вычисляемые атрибуты CActiveRecord

Сообщение iAchilles »

Метод CActiveRecord::getAttributes() по умолчанию возвращает атрибуты, которые являются полями таблицы.
Попробуйте следующее:

Код: Выделить всё

$model = Model::model()->findByPk(1);
$names = $model->attributeNames();
$names[] = 'test';
$attributes = $model->getAttributes($names); //Теперь атрибут test будет в списке.
 
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

Re: Вычисляемые атрибуты CActiveRecord

Сообщение Grigory »

Использовал Ваш подход. Спасибо. Но непонятно, почему getAttributes(true) не возвращает все поля, включая поля класса. Ведь в исходниках написано:
@param mixed $names names of attributes whose value needs to be returned.
* If this is true (default), then all attribute values will be returned, including
* those that are not loaded from DB (null will be returned for those attributes).
Аватара пользователя
iAchilles
Сообщения: 41
Зарегистрирован: 2014.09.11, 19:44

Re: Вычисляемые атрибуты CActiveRecord

Сообщение iAchilles »

@param mixed $names names of attributes whose value needs to be returned.
* If this is true (default), then all attribute values will be returned, including
* those that are not loaded from DB (null will be returned for those attributes).
Если установлено в true (по умолчанию), тогда будут возвращены значения всех атрибутов, включая и те атрибуты, которые не были загружены из Базы Данных (для этих атрибутов в качестве значения возвращается null).

***
Авторы документации здесь под "all attribute values" ("значения всех атрибутов") имеют ввиду атрибуты-поля таблицы с которой связана ActiveRecord, на это также указывает, следующее пояснение:
Returns all column attribute values. Note, related objects are not returned.
А атрибуты, которые не загружаются из БД (that are not loaded from DB) - это не те атрибуты, которые вы определили в моделе (скорее всего это вас смутило), а те, которые к примеру вы решили опустить при SELECT.

Код: Выделить всё

$model = Model::model()->find(array('select' => 'id'));
 
В этом случае вы выбираете id, а name опускаете, вот name и есть атрибут, that is not loaded from DB.
Grigory
Сообщения: 47
Зарегистрирован: 2011.09.30, 04:30

Re: Вычисляемые атрибуты CActiveRecord

Сообщение Grigory »

Ясно. Спасибо.
Ответить