【问题标题】:Multi Table Update/Delete in AtK4AtK4 中的多表更新/删除
【发布时间】:2011-12-26 15:51:46
【问题描述】:

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

【问题讨论】:

    标签: php user-interface frameworks atk4


    【解决方案1】:

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

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

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

    【讨论】:

    • 我添加了一个使用模型来执行此操作的示例 - 您是否有覆盖编辑和删除按钮所需的代码示例?谢谢
    【解决方案2】:

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

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

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

    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 并且有外键,则必须以正确的顺序进行插入和删除,例如如果 ID 上有从 TaskTypeBudget 到 TaskType 的外键,那么它应该使用 beforeDelete 和 afterInsert 来防止违反约束。

    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/page 中有一个这样的页面

    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);
            }
    }
    

    注意也要小心包含一个开头 因为这可能会导致 Ajax 出错。

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

    $config['dsn']='mysql://atktest:atktest@localhost/atktest';
    

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

    class Frontend extends ApiFrontend {
    function init(){
        parent::init();
        $this->dbConnect();  //uncommented
    

    在同一个 Frontend.php 中,在第 50 行左右插入以下内容,以在默认菜单中添加一个按钮来添加我们的新页面。

    ->addMenuItem('CRUD Test', 'tasktype')
    

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

    一旦您知道 ATk4 提供的功能是多么简洁和简单?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 2016-10-08
      • 2014-09-28
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多