2011-03-08 80 views
5

我看到各種不同的方式來處理Yii中的多對多關係。然而,我看到的例子並沒有完全充實,我覺得我錯過了一些東西。多對多的關係

例如,拉里·厄爾曼的教程不使用自:: MANY_MANY關係 - http://www.larryullman.com/2010/08/10/handling-related-models-in-yii-forms/

所以只要添加和檢索記錄,什麼標準的方式在模型,控制器處理多對多和視圖?

澄清:我想我正在尋找一個涉及2個表格的例子,涉及到多對多,我不僅可以看到兩個模型,還可以看到控制器和視圖,所以我可以完全理解正在發生的事情。

+1

這不是很清楚你到底在問什麼...... – Jon

回答

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)'), 

因此,無論$ oPurchase->交易$ oTransaction->購買自動被Yii處理。

總之,它確實可以處理多對多使用關係(至少讀取部分,寫作你仍然需要任意的解決方案)。

+0

很酷,謝謝! – djt

+0

以及這些任意的解決方案是什麼?另外,我是否必須爲橋表創建一個模型? – djt

+0

是的,您必須創建模型,但它可以只是一個帶有數據透視表名稱的空模型,不需要其他邏輯。其他的解決方案是什麼,有這樣的行爲,例如:http://www.yiiframework.com/extension/save-relations-ar-behavior/也最後的Yii版本將包括增強的功能:http://代碼。 google.com/p/yii/issues/detail?id=1117 – Blizz

0

我只是使用Yii。只是一個基本想法。如果您認爲一對多不是問題,那麼您需要在用戶和訂單之間創建一箇中間表,以創建一個UsersOrders表來映射這些鍵。然後創建函數來獲取類中的相關表,如$ this-> UsersOrders-> Orders() for function Orders in User class,反之亦然。

多對多實際上是由3張桌子打底。 2桌但中間加上隱藏的桌子。

+0

right我知道第三張桌子,但我只是想知道Yii是否有辦法用簡單的方式處理多對多使用關係或者什麼 – djt

+0

好的,如果Yii不處理它。我們可以擴展控制器以使用戶控制器中的$ this-> Orders()獲得所有訂單的列表以及其他添加/刪除關係的功能。 – CallMeLaNN

+0

但Yii **確實**處理它。檢查文檔。 –