1

親テーブルのレコードが削除されたときに子テーブルにparent_id=NULLを設定するにはどうすればよいですか?

これは、MySQLINNODBテーブルのONDELETE = SET NULLに似ていますが、INNODBレベルでこれらすべての機能(カスケード、無視、更新、nullの設定)を使用することを避け、atk4モデルに移動して、これらすべてをロジック1か所に保持したいと思います。

例えば、

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 に答える