在 Active Record 风格的 ORM 中实现预先加载的干净方法?

Posted

技术标签:

【中文标题】在 Active Record 风格的 ORM 中实现预先加载的干净方法?【英文标题】:Clean way to implement eager loading in Active Record style ORM? 【发布时间】:2011-03-25 02:46:17 【问题描述】:

我正在用 php 编写一个非常轻量级的 ActiveRecord 实现。我有基本的工作,但我想实现至少一对一关系的急切加载。我一直在集思广益,寻找一种干净的方式来做到这一点。

如果我急于加载单个一对一关系,我将必须知道两个表的列,并且必须按照一些约定为列设置别名,这将允许我将结果映射回正确的对象。

我正在寻找有关如何为每个表中的列设置别名的建议,以便尽可能轻松地将它们映射回各自的对象。

我最初的想法是将基表的列别名为“base_column_name”,将相关表的列别名为“user_email”(如果“用户”是相关对象的名称)。有没有更好的方法来做到这一点,我忽略了?

我考虑的第二种选择是从基表中取出所有对象,然后使用基表中的键将相关对象收集到一个“WHERE IN”中。但是,这会导致性能问题吗?

【问题讨论】:

【参考方案1】:

CakePHP 在其 ActiveRecord 实现中使用 php 灵活的关联数组。所以一对多的关系可能是

array('Tablename'=>array('columnname'=>'columnvalue'), 
      'AssociatedTable'=>array('0', 
             array('columnname'=>'columnvalue')));

它确实在所有内容中增加了一层,因此您必须执行 $data['tablename']['columnname'];

【讨论】:

以上是关于在 Active Record 风格的 ORM 中实现预先加载的干净方法?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 中的 Active Record 和 ORM 有啥区别?

有哪些类似于 Active Record 的 ORM 可用于 MongoDB 的 php 实现?

Atitit orm的实现模式 data-mapper模式和active-record模式有什么区别

业务逻辑层-Active Record

运行啥 ORM:telerik Open Access VS Subsonic VS linq to sql VS Active Record

SQL 基准测试:PHP ActiveRecord ORM 与 MySQL 与 CodeIgniter Active Record 与标准 PHP