own ORM:在JOIN情况下的数据库记录


own ORM: database records in case of JOIN?

我们正在做我们自己的具有ORM功能的框架。数据库表现在是类了,那么记录呢?让我们想象两个表:

Users
ID,USERNAME
Emails
USER_ID,ADDRESS

所以,一个记录对象将有getID(), getUSERNAME()方法等,但如果两个表是连接的,它不能有两个类型对吗?因为没有多重继承。那么场碰撞呢?

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

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

我认为每个类都应该代表一条记录,而整个表应该是对象的数组(或其他一些集合)。看一看http://www.doctrine-project.org/来获得一些想法。

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

对于getter和setter,可以使用__call, __get__set。详见http://php.net/manual/en/language.oop5.overloading.php

我提供了一些基于这个PHP UI框架的模型/ORM实现的见解。以下是我的一些建议:

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

希望这将帮助您找到自己的方法或决定不实现自己的ORM。这不是一件容易的事。