Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
инвентаризация:dev:model:history [2024/02/26 04:12]
admin [Таблицы]
инвентаризация:dev:model:history [2025/05/15 12:26] (текущий)
admin
Строка 1: Строка 1:
-{{tag>DEV Инвентаризация history}}+{{tag>DEV Инвентаризация history model}}
 ====== Инвентаризация: DEV: Model History ====== ====== Инвентаризация: DEV: Model History ======
 Как нам вести историю изменения моделей. Как нам вести историю изменения моделей.
Строка 20: Строка 20:
   * функцию журналирования состояния с возможностью указания инициатора изменений   * функцию журналирования состояния с возможностью указания инициатора изменений
  
 +Для возможности отображения загруженного из журнала объекта через те же формы, журнальный объект должен мимикрировать под оригинал. Для этого целесообразно все вычисляемые параметры вынести в Trait и подключить трейты и к оригиналу и к журналу
 ++++ ++++
  
Строка 31: Строка 32:
 ++++ ++++
  
-===== Как добавить историю модели ===== +====== Как добавить историю модели ====== 
-==== Таблицы ====+===== Таблицы =====
 В самой модели должны быть поля В самой модели должны быть поля
   * updated_at (timestamp()) - время обновления модели   * updated_at (timestamp()) - время обновления модели
Строка 43: Строка 44:
 Создаем таблицу для модели истории Создаем таблицу для модели истории
 Там должны быть поля Там должны быть поля
-  * master_id (integer()) - ссылка на оригинальную модель +  * master_id (integer()) - ссылка на оригинальную модель **+ индекс** 
-  * updated_at (timestamp()) - отметка о времени записи изменения +  * updated_at (timestamp()) - отметка о времени записи изменения **+ индекс** 
-  * updated_by (string(32)) - логин изменившего+  * updated_by (string(32)) - логин изменившего **+ индекс**
   * (опционально) updated_comment (string()) - можно комментировать каждое изменение   * (опционально) updated_comment (string()) - можно комментировать каждое изменение
   * changed_attributes (text()) - список полей изменившихся относительно прошлой записи (через запятую)   * changed_attributes (text()) - список полей изменившихся относительно прошлой записи (через запятую)
Строка 72: Строка 73:
  'ips'=>$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');
 </code> </code>
  
-надо, чтобы в оригинальной модели были доступны такие атрибуты. Если это many-2-many ссылки, то они там уже объявлены через Behaviour. Для обратных ссылок one-2-many можно использовать тот же механизм, прописав эти поля в Behaviour many-2-many+===== Модели ===== 
 +==== Исходная ==== 
 +Должна наследоваться от ArmsModel, тогда в процессе afterSave будет проверяться наличие класса истории, и если он естьто история изменений будет сохранена
  
 +=== Атрибуты Ссылки ===
 +надо, чтобы в оригинальной модели были доступны атрибуты с ID объектов с many-2-many и one-2-many обратными ссылками. Если это many-2-many ссылки, то они там уже объявлены через Behaviour. Для обратных ссылок one-2-many можно использовать тот же механизм, прописав эти поля в Behaviour many-2-many
 +<code php>
 +/**
 + * В списке поведений прикручиваем 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',
 + ]
 + ]
 + ];
 +}
 +</code>
  
 +=== Атрибут Name ===
 +Должен быть, если ссылки на этот объект есть в истории других объектов
 +сойдет даже вычисляемый getName()
  • инвентаризация/dev/model/history.1708920770.txt.gz
  • Последнее изменение: 2024/02/26 04:12
  • admin