如何在atk4中实现多表更新/删除?
答案 0 :(得分:1)
您可以在模型级别添加相关实体:
https://stackoverflow.com/a/7466839/204819
如果这不是一个选项,您可以随时为“编辑”和“删除”按钮创建自定义处理程序,并使用内部ORM甚至模型级别执行操作。
答案 1 :(得分:1)
您可以使用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并拥有外键,则必须按正确的顺序进行插入和删除,例如如果在Task上有一个从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 /页面一样的页面
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中,将root / root中的mysql连接用户名和密码修改为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')
现在转到您的webbrowser并输入http://localhost/agiletoolkit,然后在第一页上单击CRUD Test。添加行将导致将一行添加到TASKTYPE,并将具有相同id和budget_code的行添加到TASKTYPE_BUDGET。编辑budget_code将反映在两个表中,删除该行将从两个表中删除它。
一旦你知道ATk4提供的功能,这是多么简单和简单?