1

ModelフックbeforeDeleteは階層的に機能しないようです。例を挙げて説明しましょう。

class Model_User extends Model_Table{
    public $table='user';
    function init(){
        parent::init();
        $this->debug();
        $this->addField('name');
        $this->hasMany('Item');
        $this->addHook('beforeDelete',$this);
    }
    function beforeDelete($m){
        $m->ref('Item')->deleteAll();
    }
}

class Model_Item extends Model_Table{
    public $table='item';
    function init(){
        parent::init();
        $this->debug();
        $this->addField('name');
        $this->hasOne('User');
        $this->hasMany('Details');
        $this->addHook('beforeDelete',$this);
    }
    function beforeDelete($m){
        $m->ref('Details')->deleteAll();
    }
}

class Model_Details extends Model_Table{
    public $table='details';
    function init(){
        parent::init();
        $this->debug();
        $this->addField('name');
        $this->hasOne('Item');
    }
}

「祖父母」Model_Userでdelete()を呼び出すと、意図したとおりにすべてのItemレコードを削除しようとしますが、そこからItem.beforeDeleteフックを実行せず、Itemを削除する前にDetailsレコードを削除しません。

私が間違っているのは何ですか?

4

1 に答える 1

1

少なくとも階層モデル構造では機能するようになったと思います。

これはそれが行われた方法です:

class Model_Object extends hierarchy\Model_Hierarchy {
    public $table = 'object';

    function init(){
        parent::init();
        $this->debug(); // for debugging
        $this->addField('name');
        $this->addHook('beforeDelete',$this);
    }

    function beforeDelete($m) {
        // === This is how you can throw exception if there is at least one child record ===
        // if($m->ref('Object')->count()->getOne()) throw $this->exception('Have child records!');

        // === This is how you can delete child records, but use this only if you're sure that there are no child/child records ===
        // $m->ref('Object')->deleteAll();

        // === This is how you can delete all child records including child/child records (hierarcialy) ===
        // Should use loop if we're not sure if there will be child/child records
        // We have to use newInstance, otherwise we travel away from $m and can't "get back to parent" when needed
        $c = $m->newInstance()->load($m->id)->ref('Object');
        // maybe $c = $m->newInstance()->loadBy('parent_id',$m->id); will work too?
        foreach($c as $junk){
            $c->delete();
        }
        return $this;
    }

}

ここで重要なことは次のとおりです。
*Model_Tableではなくhierarchy\Model_Hierarchyクラスを拡張します
*beforeDeleteフックで適切なメソッドを使用します**
子がある場合は削除を制限
します-例外をスローします**deleteAll-子/子がないことが確実な場合に使用しますrecords
* * newInstance + loop + delete-レコード(子/子/ ...)を階層的に削除する必要がある場合に使用します

たぶんあなたの何人かはより良い解決策を持っていますか?

于 2012-08-09T10:40:59.527 に答える