如果您使用 ORM,请使用 ORM 之一。否则,您应该只使用 DBAL。您可以在下面找到有关他们实际工作的一些详细信息。
DBAL 代表数据库抽象层。它试图抽象出尽可能多的数据库特定内容,如驱动程序或查询语法,因此它们可以互换,而无需更改代码。
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 的 User 以及他所有的 Email 电子邮件地址。我们不在乎它们来自哪个表或它们之间的关系是什么。你得到的是一个User 类的实例,其中包含Email 对象的集合。由于 ORM 映射,所有这些都填充了正确的数据。