我正在开发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
,但我想要的是
如果这是一个方法,那么我必须将它插入一个文件中 无需在每个模型中插入此内容。如果可能的话
答案 0 :(得分:1)
如果您有多个模型并希望对它们实现常见行为,则可以使用自定义组件并在注释和其他答案(行为,规则,beforeSave等)中使用任何给定方法,并为所有模型扩展它。
在protected/components
中创建一个名为MasterModel.php
的新文件。在这个例子中,我想继承所有模型的beforeSave
方法。填写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
{
....
确保您的数据库表和模型:
答案 1 :(得分:0)
我在这里发现了一篇非常有用的文章how to insert autofill yii model data
你只需要创建一个类@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();
}