1

MyISAMデータベースでカスケードのUPDATEおよびDELETE効果を実現しようとしています(外部キーを使用してInnoDBテーブルで作成できるのと同様の効果)。2つのサンプルテーブル:

  • アルバム
  • 写真(アルバムテーブルへの「外部キー」であるalbum_id列があります)

ここで、albumsテーブルの行を削除するときに、Zend_Db_Tableでphotosテーブルの関連するすべての行を自動的に削除したいと思います。これは私がアルバムテーブルに持っているものです:

protected $_name = 'albums';

protected $_dependentTables = array(
    'Photos'
);

そして、私は写真の表にこれを持っています:

protected $_name = 'photos';

protected $_referenceMap = array(
    'Album' => array(
        'columns' => array('album_id'),
        'refTableClass' => 'Albums',
        'refColumns' => array('id')
    )
);

はい、アルバムテーブルの行を削除しても、そのアルバムの写真は削除されません。

これが私がアルバムを削除する方法です:

public function remove($id)
{
    $where = $this->getAdapter()->quoteInto('id = ?', $id, 'INTEGER');
    return $this->delete($where);
}
4

1 に答える 1

3

カスケード削除を設定する必要があります。したがって、参照マップは次のようになります。

protected $_referenceMap = array(
'Album' => array(
    'columns' => array('album_id'),
    'refTableClass' => 'Albums',
    'refColumns' => array('id'),
    'onDelete' => self::CASCADE
));

カスケード操作の詳細については、http://framework.zend.com/manual/en/zend.db.table.relationships.html#zend.db.table.relationships.cascadingを参照してください。

注意:カスケード操作は、結果セットの実際の行(つまり、Zend_Db_Table_Rowクラス)で関数が呼び出された場合にのみトリガーされます。この例で削除機能をトリガーするには:

$album = $albums->find($id);
$album->delete();//This triggers the cascading delete
于 2009-12-27T21:10:40.857 に答える