Php 自有ORM:加入时的数据库记录?

Php 自有ORM:加入时的数据库记录?,php,sql,orm,record,Php,Sql,Orm,Record,我们正在使用ORM功能开发我们自己的框架。数据库表现在是类,但是记录呢?让我们设想两张表: Users ID,USERNAME Emails USER_ID,ADDRESS 因此,一个记录对象将具有getID()、getUSERNAME()方法等,但如果这两个表被联接,它就不能有两种类型,对吗?因为没有多重继承。那么字段冲突呢?我认为每个类都应该表示一条记录,整个表应该是一个对象数组(或其他集合)。看一看,得到一些想法 对于JOIN,应该有一些定义别名的机制。这样,就可以处理场碰撞 对于ge

我们正在使用ORM功能开发我们自己的框架。数据库表现在是类,但是记录呢?让我们设想两张表:

Users
ID,USERNAME

Emails
USER_ID,ADDRESS

因此,一个记录对象将具有getID()、getUSERNAME()方法等,但如果这两个表被联接,它就不能有两种类型,对吗?因为没有多重继承。那么字段冲突呢?

我认为每个类都应该表示一条记录,整个表应该是一个对象数组(或其他集合)。看一看,得到一些想法

对于JOIN,应该有一些定义别名的机制。这样,就可以处理场碰撞


对于getter和setter,您可以使用
\uu call
\uu get
\uu set
。有关详细信息,请参阅。

DBIx::Class通过为每个表提供一个类来处理此问题,并且联接由一个方法表示,该方法获取与另一个表匹配的对象

$myAddress = $myUser->emails->address;

我将根据的模型/ORM实现提供一些见解。以下是我的一些建议:

  • 不要盲目地决定将函数映射到字段中。为什么不使用get('field')和set('field')。没有缺点(除了缺少IDE提示之外),但是您可以避免代码生成或捕获所有通常较慢的代码
  • 加入时,您不一定需要多个对象。在我的ORM中,单个模型可以处理连接的表。这引入了透明度,当您调用$model->set('address')时,它可能与联接表相关联。对于子选择,我仍然使用动态查询的子实例,但对于连接,则不需要
  • 我已经看到了继承的强大功能,以及在父模型中重新塑造父模型的能力。每张桌子都可以有一张桌子
  • 模型和ORM应该分开,但应该紧密地结合在一起。我还成功地使用通用视图和通用控制器使一切都很好地发挥作用,这非常节省时间

希望这能帮助您找到自己的方法,或者决定不实现自己的ORM。这不是一项容易的任务。

这里的确切问题是什么?在我看来,您应该拥有一个具有以下属性的
用户
实体:
int-ID、字符串用户名、电子邮件[]电子邮件地址
JOIN
只是填充
emailAddresses
字段的一种方法。但我不想将整个表/行及其外键加载到数组中,这会占用很多内存