主义实体删除VS删除查询,性能比较(Doctrine entity remove vs delete

2019-07-30 10:34发布

虽然使用的学说,我注意到,删除一个实体,我需要检索由给定的参数(姓名,身份证等)的实体,然后调用remove方法。 在另一方面,在查询时,我就可以执行删除查询。

所以,看起来,使用ORM风格需要两个操作和一般的SQL操作需要一个操作。 这就是为什么,我有点混乱,我们是否应该使用删除(或更新)操作的ORM? 是不是它的性能更差? 还是有别的我失踪? 它可以在ORM风格任何其他的方式来完成?

Answer 1:

在Doctrine2可以调用删除代理对象,这是不是从数据库加载上。 只要创建一个“虚拟”的对象,是这样的:

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

它不需要初始查询,但我不肯定是否主义仍然没有在内部上齐平 。 我没有看到它在SqlLog。

我想补充,我想这是任何像样的ORM的预期行为。 它涉及的对象和关系。 它必须知道的东西删除之前存在。 ORM不仅仅是一个查询生成 。 一般情况下,本机查询总是会在任何ORM更快。 任何ORM增加了一个抽象层,它需要一些时间来执行它。 这是一个典型的权衡,你得到一些花哨的功能和简洁的代码,但宽松一些性能。

编辑:

我很高兴它的工作适合你。 其实我无意中发现了另一个问题,这让我意识到,代理和局部对象实际上不是一回事。 部分对象实例的真实模型类,并与你想要的值填充它。 你之后初始化部分对象延迟加载不上它的工作了。 因此,例如,如果您只用ID的部分对象,并希望删除只有另一个对象场满足一定条件下,它不会工作,因为其他领域永远是零。

在另一方面,代理不懒加载工作,并且不共享的问题,部分对象有。 所以我强烈建议不要使用getPartialReference方法,而不是你可以这样做:

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

所述getReference如果它不是方法返回如果已经加载,或该对象的代理。 代理可以延迟加载的所有其他值,如果/当你需要他们。 至于你的榜样,他们的行为完全一样,但代理是肯定是一个更好的方式去。



Answer 2:

完成! 对我来说,工作就像这个附加线路3:

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


文章来源: Doctrine entity remove vs delete query, performance comparison