2012-09-18 18 views
20

Tengo una clase de producto que tiene muchos campos en ManyToMany, como ingredientes, tamaños, especies, etc. Un total de aproximadamente 14 campos diferentes No todos los campos están relevante para cada productoCómo realizar un pedido en OneToMany/ManyToOne

tengo mapeo configurado como esto

Class product { 
/** 
* @var Species[] 
* @ORM\ManyToMany(targetEntity="Species") 
* @ORM\JoinTable(name="product_species", 
*  joinColumns={@ORM\JoinColumn(name="productId", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="speciesId", referencedColumnName="id")} 
*  ) 
* @ORM\OrderBy({"name" = "asc"}) 
*/ 
private $species; 

Esto funciona muy bien para un muchosamuchos/manyto uno.

El problema está en mi mesa product_ingredients que necesitaba para agregar un campo adicional, es decir, la necesidad de cambiar de ManyToMany a un OneToMany/ManyToOne Así como esto

/** 
    * @var ProductIngredient[] 
    * 
    * @ORM\OneToMany(targetEntity="ProductIngredient", mappedBy="product") 
    * @ORM\JoinColumn(name="productId", referencedColumnName="id") 
    */ 
    private $ingredients; 

Ahora mi ProductIngredient Entidad tiene este aspecto

/** 
    * @var IngredientType 
    * @ORM\ManyToOne(targetEntity="IngredientType", fetch="EAGER") 
    * @ORM\JoinColumn(name="ingredientTypeId", referencedColumnName="id") 
    */ 
    private $ingredientType; 


    /** 
    * @var Ingredient 
    * 
    * @ORM\ManyToOne(targetEntity="Ingredient", inversedBy="products", fetch="EAGER") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="ingredientId", referencedColumnName="id") 
    * }) 
    */ 
    private $ingredient; 

    /** 
    * @var Product 
    * 
    * @ORM\ManyToOne(targetEntity="Product", inversedBy="ingredients") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="productId", referencedColumnName="id") 
    * }) 
    */ 
    private $product; 

Entonces, en mi clase de producto para especies utilizo @ORM \ OrderBy para que la especie ya esté ordenada. ¿Hay alguna forma en que de alguna manera también pueda hacer esto para mi campo de ingredientes?

¿O estoy haciendo mal mi lógica y estos ni siquiera deberían ser campos en la clase de producto y deberían estar simplemente buscando en el repositorio?

yo quería que fuera fácil, así que pude bucle a través de mis objetos como $product->getIngredients() en lugar de hacer

$ingredients = $this->getDoctrine()->getRepository('ProductIngredient')->findByProduct($product->getId()); 

Respuesta

62

en la entidad Producto acaba también AAdd la orderBy a la relación ingredientes

/** 
* ... 
* @ORM\OrderBy({"some_attribute" = "ASC", "another_attribute" = "DESC"}) 
*/ 
private $ingredients; 
+0

esto arroja un error (Unrec campo identificado: nombre) porque "nombre" no existe en ProductIngredient. Está en entidad Ingrediente. – Kris

+0

que es un error en sus otras asignaciones no en este ... –

+0

¿Me puede dar un ejemplo? Mi entidad de producto se conecta con ProductIngredient, que se conecta con Ingredient. Intenté hacer el pedido en la clase productingredient pero, como es muchtoone, se ignora – Kris

6

Bueno, se me ocurrió algo así como un hack ... Como realmente solo me importa el tipo de salida, hice una extensión básica de rama

use Doctrine\Common\Collections\Collection; 

public function sort(Collection $objects, $name, $property = null) 
{ 
    $values = $objects->getValues(); 
    usort($values, function ($a, $b) use ($name, $property) { 
     $name = 'get' . $name; 
     if ($property) { 
      $property = 'get' . $property; 
      return strcasecmp($a->$name()->$property(), $b->$name()->$property()); 
     } else { 
      return strcasecmp($a->$name(), $b->$name()); 
     } 
    }); 
    return $values; 
} 

me gustaría evitar este truco y aunque todavía me gustaría saber una solución real

+1

Me encanta, muy útil tener algo como esto en el caso de esos momentos aleatorios que desea ordenar de manera diferente – Adam

0

Como me instruyó en una pregunta similar, usted debe escribir una consulta de combinación para que el fin de ORM por el trabajo , mira aquí para referencia. http://www.krueckeberg.org/notes/d2.html

sin embargo he resuelto mi problema con una consulta en cierto modo me plugin en el lado del cliente, jQuery tabla de datos y tinysort ambos son excelentes :-)

Cuestiones relacionadas