【问题标题】:use query builder or sql doctrine使用查询生成器或 sql 原则
【发布时间】:2014-10-29 08:35:18
【问题描述】:

我做了一些研究来回答它,但我没有找到。

我想知道在以下之间选择(加入)的最佳做法是什么:

使用查询生成器?

$this->getEntityManager()->createQueryBuilder()
        ->select('e')
        ->from('Module\Entity\MyEntity 'e')
        ->innerJoin('Module\Entity\MyEntity2', 'e2', 'WITH', 'e.e2_id = e2.id')...
        ->where("...")

使用 SQL 语句?

$db = $this->getEntityManager()->getConnection();

$sql = "SELECT * FROM myEntity e
        INNER JOIN myEntity2 AS e2 ON e2.id = e.e2_id....
        WHERE ....;"

它更安全,更快,...?

【问题讨论】:

  • @SBH 说 DQL 应该是您的默认选择是正确的。您的 innerJoin 示例过于复杂。 D2 已经知道实体之间的关系。一个简单的 innerJoin('e1.e2','e2') 就是你所需要的,尽管大多数时候你可能想要使用左连接。而且(在 D2 中)你永远不会有一个名为 e2_id 的属性。只是e2。考虑对象,而不是 id。

标签: php mysql performance doctrine-orm query-builder


【解决方案1】:

各有优缺点,看你需要什么。

SQL

  1. 纯 SQL 语句要快一点,因为您不必执行来自 Doctrine 的额外逻辑
  2. 由于 Doctrine 尝试支持很多不同的数据库,因此某些数据库特定的功能不受支持,因此您不能使用它们或必须将它们实现到 Doctrine 中,这可能会成为很多工作

DQL

  1. Doctrine 强制您使用准备好的语句,只要您坚持使用命名参数,就可以更轻松地防止注入攻击。但这也可以通过纯 SQL 和 PDO 使用命名参数来完成。
  2. 使用实体要容易得多。数据会自动绑定到对象中,并通过您的应用程序进行管理。当然,这会导致一些性能开销
  3. 关于连接的一个缺点是您总是连接整个表,而不仅仅是您需要的两列。如果结果应该以对对象有用的方式出现,您需要定义关系
  4. 最大的好处可能也很少使用:如果您更改数据库,则无需重写所有查询以匹配新的查询结构

有时我发现自己可以直接在 SQL 查询中解决问题,但 Doctrine 不支持我必须使用的某些构造。所以我必须决定是否要失去 Doctrine 的好处并选择纯 SQL 解决方案或使用 DQL 并添加更多的 php 代码,甚至可能更多不必要的查询。但这在很大程度上取决于情况,不能一概而论。

最后我会尽可能使用 DQL,因为它更容易编写和维护,并且只有在我需要一些高性能查询时才切换到 SQL。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多