对于Doctrine ORM,为什么除了PDO之外还需要DBAL?
我使用 Doctrine 2 ORM 一段时间了,但有些东西我一直不太理解。
Doctrine DBAL(数据库抽象层)有什么用途? PDO本身就是一个数据库抽象层,那么为什么ORM不能直接与PDO一起工作呢?
我并不是想找到一种使用 DBAL 或任何东西的方法。我只是一直不明白为什么需要额外的层,并且似乎无法在文档中找到明确的答案。
I've been working with Doctrine 2 ORM for some time, and there's something I've never quite understood.
What purpose does the Doctrine DBAL (database abstraction layer) serve? PDO itself a database abstraction layer, so why can't the ORM work directly with PDO?
I'm not trying to find a way around using DBAL or anything. I've just never understood why the extra layer is needed, and can't seem to find a clear answer in the documentation.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,PDO 是“数据访问层”,而不是“数据库抽象层”。这意味着您可以切换数据库并仍然进行相同的方法调用,但 PDO 不会重写 sql 查询以匹配所选数据库或模拟任何数据库功能。
每个 PHP PDO 文档:
No, PDO is a "data-access layer", not a "database abstraction layer". Meaning that you can switch databases and still make the same method calls, but PDO will not re-write sql queries to match the selected database or emulate any database functionality.
Per PHP PDO docs:
Doctrine2 实际上支持一些非 PDO 数据库,这是原因之一。
查看源代码也很有用。 Connection 类(例如)有一个很好的功能:
插入一条带有转义的新记录。
Doctrine2 actually supports some non-PDO databases so that is one reason.
It's also useful to look at the source code. The Connection class (for example) has a nice:
Which inserts a new record complete with escaping.