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