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语句)
答案 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 (和反向)的更多信息。