如果你使用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映射填充了正确的数据。