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

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

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

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

Существует еще одна таблица (история) с идентификаторами столбцов, именем, 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, страницу или саму модель. Это должно влиять только на вставки, и я подумал, что, возможно, это должно быть значение по умолчанию для addField ('last_ref'), но могу ли я сделать это функцией и где должна быть определена функция?

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

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


person Trevor North    schedule 16.10.2011    source источник


Ответы (1)


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

Переопределить функцию 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», будут вашими пользовательскими реализациями.

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

person romaninsh    schedule 16.10.2011
comment
Это очень аккуратно спасибо. Проблема с пропуском значений заключалась в необходимости экспортировать данные в Excel для работы в автономном режиме, но если модель верна, я могу назначить ссылку на команду, когда данные перезагружаются из Excel в систему. - person Trevor North; 17.10.2011