我的表結構:CakePHP低效的數據庫查詢:它們可以被避免嗎?
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的一種形式? – alex 2009-10-08 02:31:04
如果是的話,CakePHP是否公開了一個數據庫庫,您可以使用它? – alex 2009-10-08 02:31:57
是的,Cake有它自己的(?)ORM系統,但我相信這些語句是在更高級別生成的 - 也就是說,Cake代碼告訴DBO生成50個左右的命令。那有意義嗎? – nickf 2009-10-08 02:49:18