Frage

Ich frage mich, ob jemand mit diesem Problem konfrontiert ist.
Nehmen wir an, ich habe zwei Tische: Produkte und Karren (viele mit vielen).

Jetzt hat die Beitrittstabelle eine zusätzliche Spalte - Menge (wie viele Produkte von bestimmten Typen im Karren enthalten).


Mein Problem ist, dass ich durch folgende Beziehung nicht auf "Betrag" zugreifen kann:

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

    );
}

Ich habe es auch versucht:

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

ohne Glück.

War es hilfreich?

Lösung

YIIs Many_Many -Implementierung hat Einschränkungen, die in einer späteren YII -Version angesprochen werden könnten.

Die Lösung hierfür besteht darin, eine weitere Modellklasse für die Many_Many -Tabelle zu verwenden. Erstellen Sie beispielsweise AR -Klassenkartonprodukt und dann würde die Beziehung für Ihren Wagen werden:

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

Auf diese Weise haben Sie einen Hinweis auf das CartProducts -Modell in der CartProducts Magic Public Property der CART -Instanz und können Ihren "Betrag" aktualisieren.

Jetzt ist es eine gute Zeit, dass ich sage, dass ich Ihre Herangehensweise an das Problem nicht mag - mit einer "Menge" -Spalte, in der die Anzahl der Produkte im Wagen enthält, weil Sie zwei Wahrheiten behalten müssen (die tatsächliche Menge an Produkten, die zugeordnet sind an den Wagen im DB- und das Zähler -Cache -Betrag "Betrag" -Feld in der übereinstimmenden Tabelle. Zwischen diesem Wert in der Spalte wie dieser (fügen Sie die folgende Beziehung zu Ihrem Wagenmodell hinzu):

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

    );
}

Auf diese Weise können Sie die Eigenschaft CART-> ProductSamenount anrufen und die tatsächliche Menge mit einer einfachen und schnellen Zählung zurückgibt (die ich denke), anstatt sich auf zwischengespeicherten Wert zu verlassen, der durch Ihren Code oder durch Ihren Code wiederhergestellt werden muss DB Trigger jedes Mal, wenn Sie die Wagenprodukte ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top