Doctrine:ORM QueryBuilder或DBAL QueryBuilder

时间:2016-04-30 20:17:42

标签: symfony orm doctrine-orm query-builder dbal

DBAL查询生成器: http://www.doctrine-project.org/api/dbal/2.3/class-Doctrine.DBAL.Query.QueryBuilder.html

ORM查询生成器: http://www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.QueryBuilder.html

Inside Doctrine中有2个非常相似的QueryBuilder,DBAL和ORM。

那两个有什么区别?与DBAL相比,使用ORM queryBuilder会有很大的开销吗?

(本机查询是不可能的,因为我需要使用动态where语句)

2 个答案:

答案 0 :(得分:6)

如果您使用 ORM ,请使用ORM。否则,您应该只使用 DBAL 。您可以在下面找到有关他们实际行动的详细信息。

DBAL 代表数据库抽象层。它试图抽象尽可能多的数据库特定的东西,如驱动程序或查询语法,因此它们可以互换,而无需更改代码。

ORM 代表对象关系映射,这比DBAL更进一步,并尝试将数据库架构绑定到应用程序中的实际类。

这两个都带有查询构建器。 DBAL查询构建器更基本,因为它仅提供与多个驱动程序/数据库的兼容性。您仍然对表进行操作,但仍然可以获得行作为结果。另一方面,ORM查询构建器旨在与实体(数据库模式绑定到的类)一起使用。

例如,DBAL查询:

$builder->select('u.id, e.id, e.email')
    ->from('users', 'u')
    ->leftJoin('u', 'emails', 'e', 'u.id = e.user_id')
    ->where('u.id = :id')
    ->setParameter(':id', $id);

$rows = $builder->execute()->fetchAll();

在这里,我们创建一个将users表与emails表连接起来的查询,以获取ID为$id的用户的所有电子邮件地址。结果将以关联数组的形式出现。现在让我们来看看ORM:

$builder->select('u','e')
    ->leftJoin('u.emails', 'e')
    ->where('u.id = :id')
    ->setParameter(':id', $id);

$user = $builder->getQuery()->getOneOrNullResult();

在这里,我们说我们希望获得身份User的{​​{1}}及其所有$id个电子邮件地址。我们不关心他们来自哪个桌子或者他们之间的关系是什么。您得到的是Email类的实例,其中包含User个对象的集合。由于ORM映射,所有数据都填充了正确的数据。

答案 1 :(得分:0)

第一个用于SQL查询,第二个用于DQL。

大多数情况下,从EntityManager::createQueryBuilder()获取QueryBuilder实例(可能通过Repository类,请参阅EntityRepository;;createQueryBuilder()),在这种情况下,您将使用Doctrine\ORM\QueryBuilder,因此编写DQL。

如果您需要运行SQL查询,您将使用Doctrine\DBAL\QueryBuilder,该实例通常从Doctrine\DBAL\Connection::createQueryBuilder()EntityManager::getConnection()检索。

您可以阅读有关the benefits of use DQL over SQL in doctrine (和反向)的更多信息。