#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 в систему.