5

YII特定のモデルに関連付けられるたびに関連するモデルを取得したり、少なくとも発生した回数のカウントを取得したりするにはどうすればよいですか?

問題:注文
のテーブルと製品のテーブルがあります。各製品は、0回以上の注文に関連付けられています。

YIIの標準のリレーショナルツールを使用して、製品が注文された回数を確認するにはどうすればよいですか?
私は共同テーブルを通じて多対多の関係を築き、それを使って私の関係を宣言しました

'products'=>array(self::MANY_MANY, 'Product', 'index_order_products(order_id, product_id)')

問題は、$ order-> productsを呼び出すと、関連するたびに製品ではなく、一意の製品のみが返されることです。

注文した各商品がいくつあるかを知るだけでいいので、試してみました

'products'=>array(self::MANY_MANY, 'Product', 'index_order_products(order_id, product_id)', 'select'=>'*, COUNT(product_id) as count', 'group'=>'product_id')

しかし、それから私がそれを呼ぼうと$order->products[0]->countすると、カウントが定義されていないと言います。
データベースに空の列数を作成することで、これを回避することができました。このようにして必要な数を取得しますが、確かにもっと良い方法があるはずです。

YIIでこのようなことをする正しい方法は何でしょうか?

4

2 に答える 2

1

正しい方法は、 統計クエリを使用することです。これらの目的のためです。

非エレガントな方法

しかし、$ order-> products [0]-> countを呼び出そうとすると、countが定義されていないと表示されます。

これは、リレーションが評価されたときに返されないオブジェクトからカウントにアクセスしているためです。CVarDumper::Dump($order->products)クエリの場合に何が得られるかを確認するために使用します

または他の方法はcount($order->products[0])

于 2012-11-07T20:31:42.383 に答える
0

countこれを使用するには、Productクラスでプロパティを定義する必要があります

'products'=>array(self::MANY_MANY, 'Product', 'index_order_products(order_id, product_id)', 'select'=>'*, COUNT(product_id) as count', 'group'=>'product_id')

 class Product extend CActiveRecord {
     public $count = 0;
 // skip in rules function add this
     array('count', 'safe'),
于 2012-11-08T05:27:24.357 に答える