1

删除父表中的记录时如何在子表中设置parent_id=NULL?

这就像 MySQL INNODB 表中的 ON DELETE = SET NULL 一样,但我想避免在 INNODB 级别使用所有这些(级联、忽略、更新和设置 null)功能,并将其移至 atk4 模型以将所有这些逻辑保留在一个地方。

例如,

class Model_Parent extends Model_Table{
  public $table='parent';
  function init(){
    parent::init();
    $this->addField('name');
    $this->hasMany('Child');
    $this->addHook('beforeDelete',$this);
  }
  function beforeDelete($m){
    // I guess here I should somehow set parent_id=NULL in all related Model_Child
    // records, but when I do so, then it's again DB constraint violation of course
    $c = $m->ref('Child');
    foreach($c as $junk){
      $c->set('parent_id',NULL); // this and below is not working
      $c->save();
    }
  }
}

class Model_Child extends Model_Table{
  public $table='child';
  function init(){
    parent::init();
    $this->addField('name');
    $this->hasOne('Parent');
  }
}
4

3 回答 3

1

您正试图通过在代码中执行典型的数据库任务来重新发明轮子。

如果您不希望数据库管理外键关系,则不应使用这些关系。在这种情况下,您可以将列设置为NULL或任何其他值。但是没有人能证明你的数据库的一致性。

于 2012-09-17T13:11:12.263 回答
1

很简单,你只需要从Model进入DSQL:

$m->ref('Child')->dsql()->set('parent_id',null)->update();

更多信息:http ://www.youtube.com/watch?v=sSRaYpoJFHk&list=PL7CBF92AB03A1CA3B&index=3&feature=plpp_video

于 2012-09-17T19:33:26.307 回答
0

检查 parent_id 列是否允许 NULL 值。

于 2012-09-17T12:47:21.747 回答