Управление увеличивающимся полем в модели с помощью ATK4 (не столбца автоинкремента mysql)

#php #model #counter #atk4

#php #Модель #счетчик #atk4

Вопрос:

ХОРОШО — это может быть просто, но у меня возникли проблемы с визуализацией того, куда мне нужно поместить то, что в ATK4.

У меня есть таблица (команда) с идентификатором столбцов, именем и ссылкой. Идентификатор — это столбец автоинкремента и ссылка. В таблице есть 3 строки, подобные этой

  id,  name,     last_ref
 1,  'Team 1',  1000
 2,  'Team 2',  1000
 3,  'Team 3',  2000
  

Существует еще одна таблица (история) со столбцами id, name, team_id и team_ref, которая после заполнения данными выглядит следующим образом

  id, name, team_id, team_ref
  1, 'Story A', 1, 1001
  2, 'Story B', 1, 1002 
  3, 'Story C', 1, 1003
  4, 'Story D', 2, 1001
  5, 'Story E', 3, 2001
  

Для каждой вставки в таблицу story в таблице team просматривается ссылка team_ref, увеличивается на 1, а результат сохраняется в строке истории. Поле last_ref также должно быть немедленно обновлено на случай, если кто-либо еще также вставит новую строку в таблицу истории.

Итак, после приведенных выше вставок в таблицу истории таблица команд должна выглядеть так, как показано ниже, чтобы каждая команда поддерживала свою собственную последовательность и распределяла числа по порядку.

  id,  name,     last_ref
 1,  'Team 1',  1003
 2,  'Team 2',  1001
 3,  'Team 3',  2001
  

Страница, на которую вставляются записи истории, является CRUD, но я не уверен, должен ли я вставлять логику в CRUD, страницу или саму модель. Это должно влиять только на вставки, и я подумал, что, возможно, это должно быть значение по умолчанию для addField(‘last_ref’), но могу ли я сделать это функцией и где должна быть определена функция?

Приятно иметь, хотя и не обязательно, было бы то, что при увеличении last_ref следует пропускать любые ссылки, которые уже используются в таблице для текущей команды (в случае, если они вставлены каким-либо другим способом, отличным от CRUD).

Заранее спасибо.

Ответ №1:

Конечно, модель — подходящее место для подобной логики, связанной с базой данных.

Переопределите функцию beforeInsert, которая будет блокировать таблицы, искать самый большой элемент и устанавливать ссылку:

 function beforeInsert(amp;$data){
    $this->myLockTable();
    $next_ref = $this->myGetNextRef();
    $data['team_ref']=$next_ref;
    return parent::beforeInsert($data);
}
function afterInsert($id){
    parent::afterInsert($id);
    $team = $this->add('Model_Team')->loadData($this->get('team_id'));
    $team->set('last_ref',$this->get('team_ref'))->update();
    $this->myUnlockTable();
}
  

Функции здесь, начинающиеся с «my», будут вашими пользовательскими.

Тогда, предполагая, что вы используете модели правильно, не было бы никаких «других средств» для вставки записи, и вам не нужно было бы беспокоиться о пропуске этих записей.

Комментарии:

1. Это очень аккуратно, спасибо. Проблема с пропуском значений заключалась в необходимости экспорта данных в Excel для работы в автономном режиме, но если модель верна, я могу назначить ссылку на команду при перезагрузке данных из Excel в систему.