【问题标题】:How to insert create date, modified date and user id by default on insert in yii如何在 yii 中插入时默认插入创建日期、修改日期和用户 ID
【发布时间】:2015-09-10 05:49:06
【问题描述】:

我正在开发 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,但我想要的是

如果这是一种方法,我必须将其插入一个文件中 无需在每个模型中都插入它。如果可以的话

【问题讨论】:

  • 在你的模型中创建一个函数beforeSave
  • 但在此我还必须在每个模型中创建beforeSave 函数。我只想在一个文件中插入一次

标签: php model-view-controller yii


【解决方案1】:

如果您有多个模型并希望在它们上实现通用行为,您可以使用自定义组件并使用 cmets 和其他答案(行为、规则、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
{
    ....

确保在您的数据库中拥有表和模型:

  • 创建日期时间
  • created_by INT
  • 更新日期时间
  • updated_by INT

【讨论】:

  • 这是我正在寻找的解决方案。谢谢老兄。
  • 在 Yii2 哪里可以创建这个 MasterModel ?
  • @Pravin Step1:在您的项目根文件夹中创建一个名为“components”的文件夹。第二步:在组件文件夹中编写您的自定义组件,例如:MyComponent.php。第三步:在 config/web.php 文件中添加你的组件。第四步:大功告成!现在您可以在任何应用程序中使用您的组件方法。取自yiiframework.com/wiki/747/…
【解决方案2】:

您可以通过三种方式做到这一点:

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_atupdated_atuser_id

【讨论】:

  • 在哪个文件中我必须使用选项 3??必须在模型中创建CTimestampBehavior.php
  • behavior() 在模型中使用,CTimestampBehaviorzii.behaviors.CTimestampBehavior 的内置类中。
  • 那么我必须在每个模型中创建behavior()。但我想要蛋糕 php 之类的东西。无需在模型中定义,如果字段为createdmodifieduser_id,它将自动插入日期
  • 不知道,yii里有没有可能。
【解决方案3】:

在这里how to insert autofill yii model data找到了一篇很有用的文章

您只需要按照@Alejandro Quiroz 的回答创建一个类。该答案中的问题是,如果字段不可用,则会引发异常,因此这是我找到的最佳解决方案。您需要检查 if($this-&gt;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();
 }

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多