Я работаю над yii и хочу, чтобы функция автоматической вставки created
, modified
и user_id
(имена моих столбцов в db). В настоящее время я делаю это следующим образом. Я должен добавить этот код в каждую модель.
public function rules()
{
return array(
......
array('created, modified', 'default', 'value'=>new CDbExpression('NOW()'), 'setOnEmpty' => false, 'on' => 'insert'),
array('modified', 'default', 'value' => new CDbExpression('NOW()'), 'setOnEmpty' => false, 'on' => 'update'),
array('user_id', 'default', 'value' => Yii::app()->user->id, 'setOnEmpty' => false,'on' => 'insert'),
array('id, feed_id, user_id, text, created, modified', 'safe', 'on'=>'search'),
..........
);
}
это работает над insert
и update
, но я хочу, чтобы
Это, если здесь метод, так что я должен вставить его в один файл и не нужно вставлять его в каждую модель. Если это возможно
Если у вас несколько моделей и вы хотите реализовать на них общее поведение, вы можете использовать пользовательский компонент и использовать любой из этих методов в комментариях и других ответах (поведение, правила, beforeSave и т.д.) И распространять его для всех моделей.
Создайте новый файл в protected/components
называемый, например, MasterModel.php
. В этом примере я хочу наследовать метод beforeSave
для всех моделей. Fill MasterModel.php
:
<?php
abstract class MasterModel extends ActiveRecord
{
public function beforeSave()
{
$current_time = date('Y-m-d H:i:s');
if ( $this->isNewRecord )
{
$this->created = $current_time;
$this->created_by = Yii::app()->user->id;
}
if ( ! $this->isNewRecord )
{
$this->updated = $current_time;
$this->updated_by = Yii::app()->user->id;
}
return parent::beforeSave();
}
}
Замените все существующие и будущие определения моделей:
<?php
class Client extends ActiveRecord
{
....
С:
<?php
class Client extends MasterModel
{
....
Убедитесь, что в таблицах и моделях базы данных:
Я нашел здесь очень полезную статью о том, как вставить данные модели автозаполнения yii
вам просто нужно создать класс, как ответил @Alejandro Quiroz. Проблема в этом ответе заключалась в том, что если поле недоступно, оно генерирует исключение, поэтому вот лучшее решение, которое я нашел. вам нужно проверить, доступен ли атрибут if($this->hasAttribute('modified'))
public function beforeSave()
{
$current_time = date('Y-m-d H:i:s');
if ( $this->isNewRecord )
{
if($this->hasAttribute('created'))
$this->created = $current_time;
if($this->hasAttribute('modified'))
$this->modified = $current_time;
if($this->hasAttribute('user_id')) // make sure user field name i user_id
$this->user_id = Yii::app()->user->id;
}
if ( ! $this->isNewRecord )
{
if($this->hasAttribute('modified'))
$this->modified = $current_time;
/* remove this if want updated by id */
//$this->updated_by = Yii::app()->user->id;
}
return parent::beforeSave();
}
Вы можете сделать это тремя способами:
1) Обновление с помощью правил моделей:
public function rules()
{
return array(
array('title','length','max'=>255),
array('title, created_at, updated_at', 'required'),
array('updated_at','default',
'value'=>new CDbExpression('NOW()'),
'setOnEmpty'=>false,'on'=>'update'),
array('created_at,updated_at','default',
'value'=>new CDbExpression('NOW()'),
'setOnEmpty'=>false,'on'=>'insert'),
array('user_id','default',
'value'=> Yii::app()->user->id,
'setOnEmpty'=>false,'on'=>'insert')
);
}
2) Другой, используемый beforeSave()
следующим образом:
public function beforeSave() {
if ($this->isNewRecord)
$this->created_at = new CDbExpression('NOW()');
$this->user_id = Yii::app()->user->id;
$this->updated_at = new CDbExpression('NOW()');
return parent::beforeSave();
}
3) Еще одна альтернатива использованию CTimestampBehavior
в ваших моделях:
public function behaviors()
{
return array(
'CTimestampBehavior'=>array(
'class'=>'zii.behaviors.CTimestampBehavior',
'createAttribute'=>'created_at',
'updateAttribute'=>'updated_at',
'setUpdateOnCreate'=>true,
'timestampExpression'=>new CDbExpression('NOW()');
)
);
}
Убедитесь, что каждая таблица имеет одинаковое имя поля created_at
, updated_at
и user_id
.
CTimestampBehavior.php
в модели?
behavior()
используемое в модели, а CTimestampBehavior
находится во встроенном классе zii.behaviors.CTimestampBehavior
.
beforeSave
.beforeSave
в каждой модели. Я хочу вставить это только один раз в один файл