Отношения многие ко многим - PullRequest
5 голосов
/ 08 марта 2011

Я вижу много разных способов справляться со многими отношениями в Yii.Однако примеры, которые я вижу, не полностью раскрыты, и я чувствую, что что-то упустил.

Например, в учебнике Ларри Уллмана не используется отношение self :: MANY_MANY - http://www.larryullman.com/2010/08/10/handling-related-models-in-yii-forms/

Итак, что касается добавления и извлечения записей, каков стандартный способ обработки «многие ко многим» в модели, контроллере и представлении?

уточнение: я полагаю, я ищу пример с двумя таблицамиСвязано многими со многими, где я могу видеть не только обе модели, но и контроллеры и представления, чтобы полностью понять, что происходит.

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Вам на самом деле нужны 3 таблицы (таким образом, дополнительная модель для сводной таблицы), но когда она у вас есть, вы можете использовать обычную функцию отношения yii.

Например, мой проект имеет отношение «многие ко многим» между покупкой и транзакцией (пожалуйста, не спрашивайте, почему :)). Таким образом, есть модель покупки, модель транзакции и модель PurchaseToTransaction, которая устанавливает связи между ними. Я могу просто выполнить транзакции $ oPurchase-> и Yii обработает часть «многие ко многим», используя отношение, оно определяется следующим образом:

'transactions' => array(self::MANY_MANY, 'Transaction', 'PurchaseToTransaction(purchaseId, transactionId)')

Обратите внимание, что для Транзакций применяется то же самое, но наоборот:

'purchases'   => array(self::MANY_MANY, 'Purchase', 'PurchaseToTransaction(transactionId, purchaseId)'),

Таким образом, Yii автоматически обрабатывает $ oPurchase-> транзакции и $ oTransaction-> покупки .

В заключение, он действительно может обрабатывать отношения «многие ко многим», используя отношения (по крайней мере, для чтения, для написания вам все еще нужны произвольные решения).

0 голосов
/ 08 марта 2011

Я просто использую Yii. Просто основная идея . Если вы подумали, Один ко многим не проблема, вам нужно создать промежуточную таблицу между ними, как для пользователей и заказов, создать таблицу UsersOrders для сопоставления этих ключей. Затем создайте функцию, чтобы получить эти связанные таблицы в классе, такие как $ this-> UsersOrders-> Orders () для функции Orders в User class, и наоборот.

Многие ко многим фактически основаны на 3 таблицах. 2 стола, но плюс скрытый стол посередине.

...