through orderby joinwith dirty active php mysql activerecord yii many-to-many

php - orderby - yii2 dirty attributes



Yii-Relaciones mĂșltiples con el mismo modelo (2)

¿Cómo puedo en YII obtener el modelo relacionado para cada vez que se ha asociado a un modelo determinado o, al menos, obtener un recuento de cuántas veces ha sucedido?

El problema:
Tengo una tabla de Pedidos y una tabla de Productos .
Cada producto está asociado al pedido 0 o más veces .

¿Cómo puedo saber a través de la herramienta relacional estándar en YII cuántas veces hay un producto en un pedido?
He creado una relación de muchos a muchos a través de una mesa conjunta y la uso para declarar mis relaciones

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

El problema es que cuando llamo $ order-> products solo devuelve los productos únicos, no un producto para cada vez que se relaciona.

Solo necesito saber cuántos hay de cada producto en el pedido, así que lo he intentado

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

Pero si intento llamar a $order->products[0]->count , dice count no ha sido definido.
Me las he arreglado para eludir esto al crear un conteo de columnas vacías en la base de datos. De esta forma obtengo el número que necesito, pero seguramente debe haber una mejor manera.

¿Cuál sería la forma correcta de hacer algo como esto en YII?


La forma correcta sería usar Statistical Query . Es para estos fines.

La forma no elegante

Pero si intento llamar a $ order-> products [0] -> count, dice count no ha sido definido.

esto se debe a que está accediendo al recuento de un objeto que no se devuelve cuando se evaluó la relación. Use CVarDumper::Dump($order->products) para ver lo que obtiene en caso de consulta

o de la otra manera podría ser count($order->products[0])


Para usarlo, necesita definir la propiedad de count en la clase de Producto

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