2012-09-18 11 views
20

Ho una classe di prodotto che contiene molti campi per ManyToMany, come ingredienti, dimensioni, specie, ecc. Un totale di circa 14 campi diversi Non tutti i campi sono rilevante per ciascun prodotto.Come ordinare su OneToMany/ManyToOne

ho mappatura istituito come questo

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; 

Questa grande opera per un ManyToMany/manyto uno.

il problema è nel mio tavolo product_ingredients avevo bisogno di aggiungere un campo aggiuntivo, il che significa necessità di passare da ManyToMany ad un OneToMany/ManyToOne Così come questo

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

Ora il mio ProductIngredient entità appare come questa

Quindi nella mia classe di prodotto per le specie io uso il @ORM \ OrderBy in modo che la specie sia già ordinata .. C'è un modo in cui posso farlo in qualche modo anche per il campo degli ingredienti?

O sto facendo la mia logica sbagliata e questi non dovrebbero nemmeno essere campi sulla classe del prodotto e dovrebbero invece essere ricercati dal repository?

mi mancava che sia facile così ho potuto scorrere i miei oggetti come $product->getIngredients() invece di fare

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

risposta

62

nell'entità del prodotto appena AADD anche l'orderBy al ingredienti relazione

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

questo genera un errore (UNREC campo individuato: nome) perché "nome" non esiste in ProductIngredient È in Entità ingrediente. – Kris

+0

questo è un errore negli altri mapping non in questo ... –

+0

Puoi farmi un esempio? La mia entità prodotto si connette a ProductIngredient, che si connette a Ingredient. Ho provato a fare il orderby nella classe productingredient ma dal momento che è un manytoone viene ignorato – Kris

6

Beh, mi è venuto in mente un modo hacker .. Poiché mi interessa davvero solo il tipo di output, ho creato un'estensione di base per ramoscello

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; 
} 

vorrei evitare questo hack e anche se ancora vorrei sapere una vera soluzione

+1

Love it, molto utile per avere qualcosa di simile in caso di quei tempi casuali che si desidera ordinare in modo diverso – Adam

0

Come sono stato incaricato di una domanda simile, si dovrebbe scrivere un join query in ordine per l'ordine ORM da al lavoro , vedi qui per riferimento. http://www.krueckeberg.org/notes/d2.html

Io però risolto il problema con una query I sorta plug-in sul lato client, jquery DataTable e tinysort entrambi sono eccellenti :-)