Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Php 条令实体删除与删除查询,性能比较_Php_Performance_Doctrine - Fatal编程技术网

Php 条令实体删除与删除查询,性能比较

Php 条令实体删除与删除查询,性能比较,php,performance,doctrine,Php,Performance,Doctrine,在使用原则时,我注意到,要删除一个实体,我需要通过给定的参数(名称、id等)检索该实体,然后调用remove方法。另一方面,在查询中,我可以只执行delete查询 所以,似乎使用ORM样式需要两个操作,而常规sql操作需要一个操作。这就是为什么,我有点困惑,我们是否应该在ORM中使用删除(或更新)操作?性能不是更差吗?或者我还缺少什么?在ORM样式中,是否可以用其他方式执行此操作?在Doctrine2中,您可以调用代理对象上的delete,该对象不是从数据库加载的。只需创建一个“虚拟”对象,类似

在使用原则时,我注意到,要删除一个实体,我需要通过给定的参数(名称、id等)检索该实体,然后调用remove方法。另一方面,在查询中,我可以只执行delete查询


所以,似乎使用ORM样式需要两个操作,而常规sql操作需要一个操作。这就是为什么,我有点困惑,我们是否应该在ORM中使用删除(或更新)操作?性能不是更差吗?或者我还缺少什么?在ORM样式中,是否可以用其他方式执行此操作?

在Doctrine2中,您可以调用代理对象上的delete,该对象不是从数据库加载的。只需创建一个“虚拟”对象,类似于:

$user = $em->getPartialReference('model\User', array('id' => $id));
$em->remove($user);
$user = $em->getReference('model\User', $id);
$em->remove($user);
它不需要初始查询,但我不太确定Doctrine是否仍然在flush内部进行查询。我在SqlLog中没有看到它

只是补充一句,我认为这是任何体面的ORM的预期行为。它处理对象和关系。在删除之前,它必须知道某些内容存在。ORM不仅仅是一个查询生成器。通常,本机查询在任何ORM中都会更快。任何ORM都会添加一个抽象层,执行它需要一些时间。这是一个典型的折衷方案,您可以获得一些花哨的特性和干净的代码,但在性能上会有所松懈

编辑:

我很高兴你成功了。实际上,我偶然发现了另一个问题,这让我意识到代理和部分对象实际上不是一回事。局部对象引用真实模型类,并用所需的值填充它。初始化部分对象后,延迟加载不再对其起作用。例如,如果您创建了一个只有id的部分对象,并且仅当另一个对象字段满足某些条件时才想删除,那么它将不起作用,因为另一个字段将始终为null

另一方面,代理确实与延迟加载一起工作,并且不共享部分对象所具有的问题。因此,我强烈建议不要使用
getPartialReference
方法,您可以执行以下操作:

$user = $em->getPartialReference('model\User', array('id' => $id));
$em->remove($user);
$user = $em->getReference('model\User', $id);
$em->remove($user);

getReference
方法返回已加载的对象,或者返回未加载的代理。如果需要,代理可以延迟加载所有其他值。至于您的示例,它们的行为将完全相同,但代理肯定是一种更好的方式。

完成! 对我来说,它的工作原理如下添加第3行:

$user = $em->getReference('model\User', $id);
$em->remove($user);
$em->flush();

如果实体具有从属/子类(子类),则使用
getReference
方法加载实体。