AtK4中的多表更新/删除


Multi Table Update/Delete in AtK4

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

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

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

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

可以使用beforeInsert, afterInsert, beforeDelete, afterDelete和beforeUpdate, afterUpdate函数在数据库中进行额外的处理。例如使用解压后的ATK 4.1.3安装在你的浏览器中,创建一个名为agiletoolkit的文件夹,下面称为ATKHOME。

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

为ATKHOME/lib/Model中的表创建两个模型,如下所示(如果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')

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

一旦您知道ATk4提供的函数是多么整洁和简单?