首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtK4中多表的更新/删除

AtK4中多表的更新/删除
EN

Stack Overflow用户
提问于 2011-12-26 23:51:47
回答 2查看 455关注 0票数 2

如何在atk4中实现多表的更新/删除?

EN

回答 2

Stack Overflow用户

发布于 2011-12-27 05:28:51

您可以在模型级别上添加相关实体:

https://stackoverflow.com/a/7466839/204819

如果这不是一个选项,您总是可以为您的“编辑”和“删除”按钮创建自定义处理程序,并使用内部ORM甚至在模型级别执行操作。

票数 1
EN

Stack Overflow用户

发布于 2011-12-28 08:04:52

您可以使用函数beforeInsert、afterInsert、beforeDelete、afterDelete和beforeUpdate、afterUpdate在数据库中执行其他处理。例如,在webroot中使用ATK 4.1.3的解压缩安装创建一个名为agiletoolkit的文件夹,该文件夹在下文中称为ATKHOME。

在mysql中创建一个包含三个字段(id、tasktype_desc和budget_code)的简单表TASKTYPE,以及另一个只包含id和budget_code的表TASKTYPE_BUDGET。

为ATKHOME/lib/Model中的表创建两个模型,如下所示(如果Model目录不存在,则可能需要创建该目录)

代码语言:javascript
复制
class Model_TaskType extends Model_Table {
     public $entity_code='tasktype';
     public $table_alias='ty';

     function defineFields(){
           parent::defineFields();

           $this->newField('id')
               ->mandatory(true);;

           $this->newField('tasktype_desc')
                ->mandatory(true);

           $this->newField('budget_code')
                ->mandatory(true);
      }

      public function afterInsert($new_id){
        $ttb=$this->add('Model_TaskTypeBudget');
        $ttb->set('id',$new_id)
            ->set('budget_code',$this->get('budget_code'));
        $ttb->insert();
        return $this;
      }

      public function beforeUpdate(&$data){
        $ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']);
        $ttb->set('budget_code', $data['budget_code']);
        $ttb->update();
        return $this;
      }

      public function beforeDelete(&$data){
        $ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']);
        $ttb->delete();
        return $this;
      }
}

注意:如果你使用的是innoDB并且有外键,你必须按正确的顺序插入和删除,例如,如果有一个外键从TaskTypeBudget到ID上的TaskType,那么它应该使用beforeDelete和afterInsert来防止违反约束。

代码语言:javascript
复制
class Model_TaskTypeBudget extends Model_Table {
    public $entity_code='tasktype_budget';
    public $table_alias='tyb';

    function defineFields(){
            parent::defineFields();

            $this->newField('id')
                ->mandatory(true);

            $this->newField('budget_code')
                    ->mandatory(true);

    }
}

在ATKHOME/页面中有这样一个页面

代码语言:javascript
复制
class page_tasktype extends Page {

    function init(){
        parent::init();
        $p=$this;

        $tt=$this->add('Model_TaskType');
        $crud=$p->add('CRUD');
        $crud->setModel($tt, array('id','tasktype_desc', 'budget_code'));

        if($crud->grid)
          $crud->grid->addPaginator(10);
        }
}

另请注意,要包括开头的<?php标记放在每个类行之前,但不要包含结束?>,因为这可能会在Ajax中导致错误。

在ATKHOME/config-default.php中,将mysql连接用户名和密码从root/root修改为mysql数据库的用户名和密码。

代码语言:javascript
复制
$config['dsn']='mysql://atktest:atktest@localhost/atktest';

修改ATKHOME/lib/Frontend.php,取消注释允许所有页面连接到数据库的第8行(也可以将$this->dbConnect();行添加到页面。

代码语言:javascript
复制
class Frontend extends ApiFrontend {
function init(){
    parent::init();
    $this->dbConnect();  //uncommented

在同一个Frontend.php中,在第50行周围插入以下代码,以便在默认菜单中添加一个按钮来添加我们的新页面。

代码语言:javascript
复制
->addMenuItem('CRUD Test', 'tasktype')

现在转到您的Test浏览器并输入http://localhost/agiletoolkit,然后在第一个页面上单击CRUD Test。添加行将导致将一行添加到TASKTYPE,并将具有相同id和budget_code的行添加到TASKTYPE_BUDGET。编辑budget_code将反映在两个表中,删除行将从两个表中删除它。

一旦你知道了ATk4提供的函数,这是多么的整洁和简单?

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

https://stackoverflow.com/questions/8637184

复制
相关文章

相似问题

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