Doctrine: ORM QueryBuilder 或者 DBAL QueryBuilder

6
2个回答

9
如果你使用ORM,请选择ORM。否则,你应该选择DBAL。下面是一些关于它们实际执行的细节。
DBAL代表Database Abstraction Layer(数据库抽象层)。它试图将数据库特定的东西如驱动程序或查询语法抽象出来,以便可以互换而无需更改代码。
ORM代表Object Relational Mapping(对象关系映射),这比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();

这里,我们想获取具有id为$id的所有Email电子邮件地址的User用户。我们不关心它们来自哪个表或它们之间的关系如何。你将得到一个User类的实例,其中包含一组Email对象,所有这些都通过ORM映射填充了正确的数据。

还要注意的是,ORM还支持本地SQL查询和自定义结果集映射。为了报告目的、聚合数据等类似情况,应该避免使用ORM实体,而选择使用表查询,以减少在实例化时实体提供的业务逻辑所固有的开销。 - Will B.

2
第一个是用于SQL查询,第二个是用于DQL查询。
通常情况下,从EntityManager::createQueryBuilder()(可能通过Repository类,参见EntityRepository;;createQueryBuilder())获取QueryBuilder实例,在这种情况下,您将使用Doctrine\ORM\QueryBuilder并编写DQL。
如果您需要运行SQL查询,则会使用Doctrine\DBAL\QueryBuilder,该实例通常从Doctrine\DBAL\Connection::createQueryBuilder()通过EntityManager::getConnection()检索。
您可以阅读更多关于在doctrine中使用DQL而不是SQL的好处(反之亦然)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接