我在Yii中看到了处理多对多关系的各种不同方法。然而,我所看到的例子并没有完全充实,我觉得我错过了一些东西。
例如,Larry Ullman的教程没有使用self :: MANY_MANY关系 - http://www.larryullman.com/2010/08/10/handling-related-models-in-yii-forms/
至于添加和检索记录,在模型,控制器和视图中处理多对多的标准方法是什么?
澄清:我想我正在寻找一个涉及2个表的例子,这些表由多对多相关,我不仅可以看到两个模型,还可以看到控制器和视图,所以我可以完全理解发生了什么。答案 0 :(得分:5)
您实际上需要3个表(因此是数据透视表的额外模型),但是一旦拥有它,您实际上可以使用常规的yii关系功能。
例如,我的项目在购买和交易之间存在多对多的关系(请不要问为什么:))。因此,有一个Purchase模型,一个Transaction模型和一个PurchaseToTransaction模型,它建立了它们之间的链接。我可以做一个$ oPurchase->事务,Yii将使用该关系处理多对多部分,它的定义如下:
'transactions' => array(self::MANY_MANY, 'Transaction', 'PurchaseToTransaction(purchaseId, transactionId)')
请注意,对于交易,同样适用,但反过来说:
'purchases' => array(self::MANY_MANY, 'Purchase', 'PurchaseToTransaction(transactionId, purchaseId)'),
因此,Yii会自动处理 $ oPurchase->交易和 $ oTransaction->购买。
总之,它确实可以处理多对多的使用关系(至少在阅读部分,为了写你还需要任意解决方案)。
答案 1 :(得分:0)
我只是使用Yii。只是一个基本想法。如果你认为一对多不是问题,那么你需要在中间创建一个中间表,如用户和订单,创建一个UsersOrders表来映射这些键。然后创建函数以获取类中的相关表,如 $ this-> UsersOrders->订单(),用于用户中的功能订单上课,反之亦然。
多对多实际上是由3个表组成的。 2张桌子,但中间加上隐藏的桌子。