多对多的关系

时间:2011-03-08 01:33:37

标签: php many-to-many yii

我在Yii中看到了处理多对多关系的各种不同方法。然而,我所看到的例子并没有完全充实,我觉得我错过了一些东西。

例如,Larry Ullman的教程没有使用self :: MANY_MANY关系 - http://www.larryullman.com/2010/08/10/handling-related-models-in-yii-forms/

至于添加和检索记录,在模型,控制器和视图中处理多对多的标准方法是什么?

澄清:我想我正在寻找一个涉及2个表的例子,这些表由多对多相关,我不仅可以看到两个模型,还可以看到控制器和视图,所以我可以完全理解发生了什么。

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张桌子,但中间加上隐藏的桌子。