2

好的 - 这可能很简单,但我无法想象我需要在 ATK4 中放置什么。

我有一个表(团队),其中包含 id、name 和 reference 列。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、页面或模型本身。它应该只影响插入,我认为它可能应该是 addField('last_ref') 上的 defaultValue 但我可以将它设为一个函数吗?该函数应该在哪里定义?

尽管不是必需的,但最好的一点是 last_ref 的递增应该跳过当前团队的表中已经使用的任何引用(如果通过 CRUD 以外的其他方式插入)。

提前致谢。

4

1 回答 1

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”开头的函数将是您自定义实现的函数。

然后,假设您正确使用模型,将没有“其他方式”来插入记录,您无需担心跳过这些条目。

于 2011-10-16T16:33:09.793 回答