首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ATK4管理模型中的递增字段(不是mysql自动递增列)

使用ATK4管理模型中的递增字段(不是mysql自动递增列)
EN

Stack Overflow用户
提问于 2011-10-16 16:33:49
回答 1查看 115关注 0票数 2

好的,-this可能很简单,但是我很难想象我需要在ATK4中放什么东西。

我有一个表(team),其中包含id、name和reference列。id是一个自动增量列和一个引用。表中有3行,如下所示

代码语言:javascript
运行
复制
 id,  name,     last_ref
 1,  'Team 1',  1000
 2,  'Team 2',  1000
 3,  'Team 3',  2000

还有另一个表(story),其中包含id、name、team_id和team_ref列,填充数据后如下所示

代码语言:javascript
运行
复制
 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表中查找team_ref,递增1,并将结果存储在故事行中。last_ref字段也应该立即更新,以防其他任何人也向story表中插入新行。

因此,在上面插入到故事表中之后,团队表应该如下所示,以便每个团队都保持自己的序列并按顺序分配数字。

代码语言:javascript
运行
复制
 id,  name,     last_ref
 1,  'Team 1',  1003
 2,  'Team 2',  1001
 3,  'Team 3',  2001

插入故事记录的页面是CRUD,但不确定我是否应该将逻辑插入CRUD、页面或模型本身。它应该只影响插入,我想也许它应该是addField上的一个defaultValue (‘last_ref’),但是我能让它成为一个函数吗?应该在哪里定义这个函数?

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-17 00:33:10

当然,Model是适合这样与数据库相关的逻辑的地方。

重新定义beforeInsert函数,该函数将锁定表、查找最大元素并设置引用:

代码语言:javascript
运行
复制
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“开头的函数将是您自定义实现的函数。

然后,假设您正确地使用了模型,则将没有“其他方法”来插入记录,并且您将不需要担心跳过这些条目。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7783199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档