Много ко многим, с другой колонкой - PullRequest
4 голосов
/ 26 июля 2011

Мне интересно, сталкивался ли кто-нибудь с этой проблемой.Давайте предположим, что у меня есть две таблицы: продукты и тележки (многие относятся ко многим).Теперь в присоединяемой таблице есть дополнительный столбец - количество (сколько товаров определенного типа в корзине).

Моя проблема в том, что я не могу получить доступ к столбцу «сумма» через следующее отношение:

public function relations()
{       
    return array(
           'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'),

    );
}

Я также попытался:

'products'=>array(self::HAS_MANY, 'Product','product_id','through'=>'cart_products'),

без удачи.

1 Ответ

14 голосов
/ 26 июля 2011

Реализация Mii_MANY в Yii имеет ограничения, которые могут быть устранены в более поздней версии Yii.

Решением этой проблемы является использование еще одного класса модели для таблицы MANY_MANY.Например, создайте класс AR CartProduct, и тогда отношение для вашей корзины станет:

public function relations()
{       
    return array(
           'cartProducts'=>array(self::HAS_MANY, 'CartProduct', 'cart_id'),
           'products'=>array(self::HAS_MANY, 'Product', 'product_id', 'through' => 'CartProduct'),
    );
}

Таким образом, вы будете иметь ссылку на модель CartProducts в волшебном открытом свойстве cartProducts экземпляра Cart и сможете обновитьваше «количество».

Теперь самое время сказать, что мне не нравится ваш подход к проблеме - наличие столбца «количество», в котором хранится количество товаров в корзине, потому что вы должны сохранятьдве истины (фактическое количество продуктов, которые сопоставлены с корзиной в БД и поле «количество» в кэше счетчика в соответствующей таблице.) Если у вас нет очень очень тяжелого приложения, которое нуждается в этой денормализации БД, я бы сделал "встречное отношение ", чтобы получить количество продуктов, вместо того, чтобы кэшировать это значение в столбце, как это (добавьте следующее отношение к вашей модели корзины):

public function relations()
{       
    return array(
           'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'),
           'productsAmount'=>array(self::STAT, 'Product', 'cart_products(cart_id, product_id)'),

    );
}

Таким образом, вы можете вызвать cart-> protuctsAmountсвойство, и он вернет фактическую сумму с помощью простого и быстрого запроса подсчета (который будетя думаю, что он кешируется) вместо того, чтобы полагаться на кешированное значение, которое должно генерироваться вашим кодом или триггерами db каждый раз, когда вы меняете продукты корзины.

...