Как вставить дату создания, дату изменения и идентификатор пользователя по умолчанию при вставке в yii

1

Я работаю над 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
    создать функцию в вашей модели beforeSave .
  • 0
    но в этом также я должен создать функцию beforeSave в каждой модели. Я хочу вставить это только один раз в один файл
Теги:
model-view-controller
yii

3 ответа

1
Лучший ответ

Если у вас несколько моделей и вы хотите реализовать на них общее поведение, вы можете использовать пользовательский компонент и использовать любой из этих методов в комментариях и других ответах (поведение, правила, 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
{
    ....

Убедитесь, что в таблицах и моделях базы данных:

  • созданный DATETIME
  • created_by INT
  • обновленный DATETIME
  • updated_by INT
  • 0
    это решение, которое я искал. Спасибо приятель.
  • 0
    Где я могу создать эту MasterModel в Yii2?
Показать ещё 1 комментарий
0

Я нашел здесь очень полезную статью о том, как вставить данные модели автозаполнения 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();
 }
0

Вы можете сделать это тремя способами:

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.

  • 0
    в каком файле я должен использовать вариант 3 ?? должны создать CTimestampBehavior.php в модели?
  • 0
    behavior() используемое в модели, а CTimestampBehavior находится во встроенном классе zii.behaviors.CTimestampBehavior .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню