Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP低效的数据库查询:可以避免吗?_Php_Sql_Cakephp - Fatal编程技术网

CakePHP低效的数据库查询:可以避免吗?

CakePHP低效的数据库查询:可以避免吗?,php,sql,cakephp,Php,Sql,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 FR

我的表格结构:

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
蛋糕这样做有什么原因吗?如果没有,您知道有什么方法可以在不破坏核心库的情况下简化过程吗


以下是相关的代码位:

// 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;
}

不幸的是,蛋糕就是这样做的

您可以使用类似以下粗略模型的内容覆盖模型中的
del()
方法:

function del($id, $cascade = true) {
    if ($cascade) {
        $this->BoxesItem->deleteAll(array('BoxesItem.box_id' => $id));
    }
    return parent::del($id, false);
}

如果您有hasMany关系(我假设是这种情况),您可能希望尝试设置“独占”标志:


exclusive:当exclusive设置为true时,递归模型删除通过deleteAll()调用进行删除,而不是单独删除每个实体。这大大提高了性能,但可能并不适合所有情况。

我假设您使用的是ORM形式?如果是,CakePHP是否公开了您可以自己使用的数据库库?是的,Cake有自己的(?)ORM系统,但我相信这些语句是在更高的级别生成的-也就是说,Cake代码告诉DBO生成大约50个命令。这有意义吗?您可以发布您操作中的实际代码以及任何相关回调吗?也许您有一些可以修剪的地方?方法末尾对parent::del(…)的调用。它到底做了什么?@smchacko:它调用父类的原始
del()
方法,该类是模型继承的类,它覆盖的
del()
是谁。阅读关于对象继承:和
parent
关键字:如果您试图避免生成低效的SQL查询,为什么还要再次调用parent::del()?父级将发现它没有要删除的项,因此它不会逐个调用所有的delete语句。更准确地说,我们在调用它时,将
$cascade
设置为false,这样它就不需要处理关联的模型,只需对主模型执行一次删除。看到马修的回答,我真的同意他的想法。如果您希望对删除操作有很大的控制权,那么我的方法仍然很有用。