2

これは私の単純なコードです:

$this->deleteAll(array('expiration <=' => CakeTime::format('Y-m-d H:i:s', time())));

クエリ結果にこれが表示されます。

SELECT `Token`.`id` FROM `cake`.`tokens` AS `Token` WHERE `expiration` <= '2012-10-23 14:37:04'
DELETE `Token` FROM `cake`.`tokens` AS `Token` WHERE `Token`.`id` = (6)

要するに、CakePHPは最初に条件に対応するレコードのIDを取得し、次に取得したIDを使用して削除に進むようです。

ただし、次の条件を使用して直接続行できるため、これは意味がありません。

DELETE `Token` FROM `cake`.`tokens` AS `Token` WHERE `expiration` <= '2012-10-23 14:37:04'

なぜこれが起こるのですか?

4

1 に答える 1

4

モデルのコールバックを実行する場合、または削除をカスケードして依存するレコードを削除する場合は、レコードを個別にフェッチして削除する必要があります。したがって、関数のパラメータにfalseを渡す$cascadeと、最初にレコードを取得せずに、単一のクエリを使用してレコードが削除されます。$callbacksdeleteAll()

于 2012-10-23T12:49:22.187 に答える