Управление увеличивающимся полем в модели с ATK4 (не колонка автоинкремента mysql) - PullRequest
2 голосов
/ 16 октября 2011

ОК - это может быть просто, но у меня возникают проблемы с визуализацией, куда мне нужно поместить что-то в ATK4.

У меня есть таблица (команда) с id столбца, именем и ссылкой. Идентификатор является автоинкрементным столбцом и ссылкой. В таблице есть 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

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

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

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

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

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

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

1 Ответ

1 голос
/ 16 октября 2011

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

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

function beforeInsert(&$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», будут вашими собственно реализованными.

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

...