Estoy teniendo bastantes dudas de como implementar mi diseño con Yii.
El problema reside en una parte pequeña del sistema, conformada por 3 clases de mi dominio del problema, se trata de un control de stock para una juguetería.
El UML que representa mi diseño es este:
^[Combo|descuento|precioVenta():integer], [Producto]^[Juguete|precioCosto;porcentajeGanancia|precioVenta():integer], [Combo]<>-[Producto]"]Enlace al UML
El diseño es básicamente un Composite donde yo tengo productos, de Producto heredan Combo y Juguete, y Combo tiene una colección de Productos, o sea que puede estar conformado por juguetes u otros combos.
El método precioVenta es abstracto en Producto y tanto Juguete como Combo deben implementarlo. En el caso de Juguete se hará a partir del precioCosto y el porcentajeGanancia, mientras que en el Combo se recorrerá la lista de juguetes y combos (o sea, de productos), y a la suma total se le aplicará un descuento (con los descuentos de los otros combos ya calculados).
El problema es cuando tengo que mapear esto en una base de datos para que Yii lo pueda interpretar como yo quiero… me estuve rebanando los cesos pero no encuentro solución. El principal problema lo vi cuando intenté pensar el método relations del modelo Combo, aquí tenía que tener una relación MANY_MANY (un combo tiene muchos productos y un producto puede pertenecer a muchos combos) en la que los objetos del array generado por Yii debían ser polimórficos, o sea, un array de Juguetes y Combos mezclados, y al ver eso me perdí totalmente.
Gracias por contestar, pero sigo con un problema, con el diagrama que me mandaste puedo relacionarlo, o sea Combo tiene Productos, pero en realidad Combo no puede tener productos, sino alguna de sus especializaciones, ya que en mi modelo no tiene sentido instanciar Producto, es mas, es una clase abstracta.
Entonces en la variable relacionada que podría llamar "productos" definida en Combo::relations debería ser un arreglo de Juguetes y/o Combos, pero no de Productos. Y poder manejarme con su funcionalidad común.