【问题标题】:Is ORM all or nothing?ORM 是全有还是全无?
【发布时间】:2011-04-15 12:21:09
【问题描述】:

如果我使用 ORM,比如说 Zend 或 Symfony。这是全有还是全无的交易?

我想使用 ORM,但也想在某些情况下优化性能并自己编写查询以了解细节。因此,如果我开始使用 ORM,一旦我将它包含在我的项目中,是否会很难以旧方式进行操作?

【问题讨论】:

  • 依赖于ORM,例如NHibernate支持named queries
  • 您考虑过哪些 ORM?

标签: php zend-framework orm symfony1


【解决方案1】:

大多数 ORM 允许您运行即席查询。

【讨论】:

  • Which ORMs were you considering? 我正在研究推进和理论,至少目前是这样。
  • Zend 有能力获取数据库句柄,也可以在数据库中触发原始查询。将所有数据库访问代码放入模型类中更为重要,这样您可以稍后找到并更新它,而不是在我看来纯粹坚持 orm。
【解决方案2】:

使用 Doctrine 很容易“突破” ORM。 Doctrine 允许您以 4 种不同的方式编写查询:

  • DQL。 Doctrine 自己的查询语言,具有 Doctrine 的所有优点。
  • “原始”DQL(Doctrine2 中的“本机查询”)。这与 DQL 类似,但在命令中允许更多的灵活性(例如数据库特定功能)。在这种模式下,您必须详细说明组件之间的关系。
  • SQL,使用 PHP 的 PDO。您可以使用 Doctrine_Connection 获取 PDO 实例,该实例可让您编写查询,但仍具有 PDO 赋予的额外安全性和易用性。
  • 原始 SQL。虽然我不确定你为什么想要它,但我认为 Doctrine 提供了这一点,如果没有,你总是可以完全脱离 Doctrine。

如果您在 Symfony 内部使用 Doctrine,那么 Symfony 绝对没有任何功能可以锁定您使用 Doctrine,即使它已启用。

最后一个警告:如果您使用 Doctrine 的一些高级功能(例如事件或行为),当您在 DQL 之外进行查询时,这些功能将变得难以配合。

【讨论】:

  • events or behaviors 你的意思是created_atupdated_at
  • 如果您使用 Doctrine 的 Timestampable 行为,它不会管理插入到 Doctrine 之外的记录。但是,Doctrine 不会阻止您管理时间戳,但您会在 Doctrine 之外开始。
【解决方案3】:

你可以随意混搭。主要风险是在您的工具之间引入不兼容的不一致。 假设的例子:

如果我有一个名为 User 的学说 ORM 实体,并且我使用 Zend_Db_Table 在用户表上的刷新之间更改一些值,我可能会产生一些无意的副作用或不良行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-09-28
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多