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

时间:2012-09-17 12:27:27

标签: atk4 php

如果删除父表中的记录,如何在子表中设置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');
  }
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

检查parent_id列是否允许NULL值。