ivir3zam / phalcon-model-middleware
此库用于连接Phalcon中的模型,类似于UML类图。合并两个模型创建一个单一模型。这是多态关系的实现。
Requires
- php: >=5.4.0
- ext-phalcon: >=2.0.6
README
Phalcon php框架是一个强大的框架,专注于优化,用于创建大规模项目。但是,模型之间没有多态关系。我通过创建一个可以放置在两个类中间件中的特质来解决此问题,将它们合并为一个单一模型。在这个演示中,我们可以有一个模型,实际上在数据库中有两个或多个表。使用这个特质就像玩刀一样!你必须知道你在做什么。
案例#1(不同类型的用户)
问题
想象一个系统,有一个名为Users的父类。每个用户都可以登录到系统中,因此有一个名为users的表。我们还有一个名为Customers的类,它继承自Users,因此Customers可以登录到系统中并提交订单。我们还有一个名为Operators的类,它继承自Users,因此他们可以登录到系统中但不能提交订单,但他们可以查看管理区域。在UML中,这些是3个简单的类,有2个继承。在数据库中,这些可以有3个表和关系。但在Phalcon中使用这三个表会令人困惑。每次都必须连接表以查找所需的记录。但有了这个特质,一切都会顺利。
解决方案
你必须创建3个表:users、customers和operators,所有表都有一个名为id的主键。customers和operators的id字段都有一个外键与users.id字段相关联。然后创建3个模型:Users、Customers、Operators。然后创建一个名为UsersMiddleware的中间类。Users必须继承Phalcon\Mvc\Model。UsersMiddleware是一个抽象类,继承自Users并使用IVIR3zaM/Phalcon-Model-Middleware/ModelsMiddleware作为特质。Customers和Operators继承自UsersMiddleware。现在你可以向UsersMiddleware添加一个名为getUniqueField()的函数,以指定所有3个表的外键是哪个唯一字段。在Users模型中,你必须至少有一个字段来指定用户的类型。我们将其称为type。在我们的案例中,type可以是Customer或Operator。现在你必须向Customers和Operators添加一个名为getCustomFields()的函数,该函数返回用于检测用户类型及其所需数据的列。对于Customers,可以返回['type' => 'Customer'],对于Operators,可以返回['type' => 'Customer']。你完成了!
用例
现在你可以像这样找到客户:Customers::find(['id > 10'])
并获取完整的属性的客户对象。但是有一个问题。我的特质使用afterFetch()钩子来填充Customers对象的全部属性。所以当你遍历Customers时,会对每个客户执行一个SELECT查询以获取该客户的用户数据!所以如果你要遍历太多记录,不要使用这个函数,而是使用fullFind函数,例如Customers::fullFind(['id > 10'])
。在这种情况下,所有数据将通过一个连接查询以单个查询的方式获取。但是在这种情况下,fullFind将返回一个Phalcon\Mvc\Model\Row对象的数组!这是Phalcon政策返回Row对象在连接查询上。您可以使用这些对象代替原始对象在视图中,但如果您需要实际对象进行某些操作,例如更新数据,可以这样做:
$customers = Customers::fullFind(); foreach($customers as $customer) { $customer->name = ($customer->gendre == 'Man'?'Mr.':'Mrs.').$customer->name; Customers::toObject($customer)->save(); }