【发布时间】:2009-10-07 22:58:22
【问题描述】:
我的表结构:
boxes (id, boxname)
boxes_items (id, box_id, item_id)
我正在查看“删除框”操作的 SQL 日志,有点害怕。
SELECT COUNT(*) AS count FROM boxes Box WHERE Box.id = 191
SELECT BoxesItem.id FROM boxes_items BoxesItem WHERE BoxesItem.box_id = 191
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1685
DELETE FROM boxes_items WHERE boxes_items.id = 1685
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1686
DELETE FROM boxes_items WHERE boxes_items.id = 1686
-- snip 50 more SELECT & DELETE statements --
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1733
DELETE FROM boxes_items WHERE boxes_items.id = 1733
DELETE FROM boxes WHERE boxes.id = 191
这可能是我能想到的从这些表中删除的最不有效的方法。我的意思是,它可以用这个代替:
DELETE FROM boxes WHERE id = 191
DELETE FROM boxes_items WHERE box_id = 191
Cake 这样做有什么理由吗?如果没有,您知道我可以在不破坏核心库的情况下简化程序吗?
以下是相关的代码:
// app/controllers/boxes_controller.php /////////////
public function delete($id = null) {
if ($this->Box->del($id)) {
$this->redirect(array('action'=>'index'));
}
}
// app/models/box.php ///////////////////////////////
class Boxes extends AppModel {
var $hasAndBelongsToMany = array(
'Item'
);
}
// app/models/app_model.php /////////////////////////
class AppModel {
var $actsAs = array('Containable');
var $recursive = -1;
}
【问题讨论】:
-
我假设您使用的是 ORM 形式?
-
如果是,CakePHP 是否公开了您可以自己使用的数据库库?
-
是的,Cake 有自己的(?)ORM 系统,但我相信这些语句是在更高级别生成的——也就是说,Cake 代码告诉 DBO 生成大约 50 个命令.这有意义吗?
-
您可以发布您的操作中的实际代码以及任何相关的回调吗?也许你有一些可以修剪的东西?