如何在yii中插入时默认插入创建日期,修改日期和用户ID

时间:2015-09-10 05:49:06

标签: php model-view-controller yii

我正在开发yii并希望自动插入createdmodifieduser_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'),
       ..........
    );
}

这适用于insertupdate,但我想要的是

  

如果这是一个方法,那么我必须将它插入一个文件中   无需在每个模型中插入此内容。如果可能的话

2 个答案:

答案 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
{
    ....

确保您的数据库表和模型:

  • 创建了DATETIME
  • created_by INT
  • 更新了DATETIME
  • updated_by INT

答案 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();
 }