Содержание

, , ,

Инвентаризация: DEV: Model History

Как нам вести историю изменения моделей.

Первоначальная задумка

Кандидаты на аудит

Как добавить историю модели

Таблицы

В самой модели должны быть поля

$this->addColumnIfNotExist('aces','updated_at',$this->timestamp(),true);
$this->addColumnIfNotExist('aces','updated_by',$this->string(32),true);

Создаем таблицу для модели истории
Там должны быть поля

Все поля оригинальной модели нужно также добавить в том же виде (если не добавить, то их история не будет вестись)
Также (если) нужно добавить поля для many-2-many и обратных ссылок в виде (text()) полей. Туда будут складываться ID объектов связанных с моделью.
Например:

$this->createTable('aces_history',[
	'id'=>$this->primaryKey(),
	'master_id'=>$this->integer(),
	'updated_at'=>$this->timestamp(),
	'updated_by'=>$this->string(32),
	'updated_comment'=>$this->string(),
	'changed_attributes'=>$this->text(),
 
	'comment'=>$this->string(),
	'notepad'=>$this->text(),
	'acls_id'=>$this->integer(),
	'users_ids'=>$this->text(),
	'comps_ids'=>$this->text(),
	'access_types_ids'=>$this->text(),
	'ips'=>$this->text(),
]);
$this->createIndex('aces_history-master_id','aces_history','master_id');
$this->createIndex('aces_history-updated_at','aces_history','updated_at');
$this->createIndex('aces_history-updated_by','aces_history','updated_by');

Модели

Исходная

Должна наследоваться от ArmsModel, тогда в процессе afterSave будет проверяться наличие класса истории, и если он есть, то история изменений будет сохранена

Атрибуты Ссылки

надо, чтобы в оригинальной модели были доступны атрибуты с ID объектов с many-2-many и one-2-many обратными ссылками. Если это many-2-many ссылки, то они там уже объявлены через Behaviour. Для обратных ссылок one-2-many можно использовать тот же механизм, прописав эти поля в Behaviour many-2-many

/**
 * В списке поведений прикручиваем many-to-many ссылки
 * @return array
 */
public function behaviors()
{
	return [
		[
			'class' => \voskobovich\linker\LinkerBehavior::className(),
			'relations' => [
				'users_ids' => 'users',
				'comps_ids' => 'comps',
				'access_types_ids' => 'accessTypes',
			]
		]
	];
}

Атрибут Name

Должен быть, если ссылки на этот объект есть в истории других объектов
сойдет даже вычисляемый getName()