2012-09-18 11 views
20

Mam klasę produktu, która zawiera wiele pól dla ManyToMany, takich jak składniki, rozmiary, gatunki, itp. Łącznie około 14 różnych pól Nie wszystkie pola są istotne dla każdego produktu.Jak zamówić przez OneToMany/ManyToOne

mam mapowanie skonfigurować jak ten

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; 

Działa to doskonale na manytomany/manyto jednym.

Problem polega na moim stole product_ingredients Musiałem dodać dodatkowe pole, co oznacza konieczność przejścia z ManyToMany do OneToMany/ManyToOne Więc tak

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

Teraz moja ProductIngredient Podmiot wygląda następująco

/** 
    * @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; 

Tak więc w mojej klasie produktów dla gatunków używam @ORM \ OrderBy, więc gatunki są już zamówione .. Czy istnieje sposób, w jaki sposób mogę to zrobić w moim polu składników?

Czy robię źle swoją logikę, a te nie powinny być nawet polami w klasie produktów i powinny być po prostu wyszukiwane przez repozytorium?

ja chce go mieć łatwy więc mogłem pętli mojego obiektów jak $product->getIngredients() zamiast robić

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

Odpowiedz

62

w jednostce Produktu tylko AADD również orderby na składniki stosunku

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

to zgłasza błąd (Unrec rozpoznane pole: name), ponieważ "name" nie istnieje w ProductIngredient Jest w encji składnika. – Kris

+0

To jest błąd w twoich innych mapowaniach, nie w tym ... –

+0

Czy możesz dać mi przykład? Moja encja produktowa łączy się z ProductIngredient, który łączy się z Ingredient. Próbowałem wykonać polecenie w klasie productingredient, ale ponieważ jest to wieletoone, jest ono ignorowane. – Kris

6

Cóż, wymyśliłem hackish sposób. Ponieważ naprawdę zależy mi tylko na sortowaniu na wyjściu, zrobiłem podstawowe rozszerzenie gałązki

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

Chciałbym uniknąć tego siekać i choć nadal chcieliby wiedzieć rzeczywistego rozwiązania

+1

Uwielbiam to, bardzo przydatne, aby mieć coś takiego w przypadku tych losowych razy, które chcesz zamówić inaczej – Adam

0

Jak zalecono w podobnej kwestii, powinieneś napisać dołączyć kwerendę w celu zlecenia ORM przez do pracy , patrz tutaj w celach informacyjnych. http://www.krueckeberg.org/notes/d2.html

ja jednak rozwiązać mój problem z kwerendy I rodzaj wtyczki po stronie klienta, jQuery DataTable i tinysort oba są doskonałe :-)

Powiązane problemy