2012-09-18 59 views
20

我有一個產品類,其上有許多字段,用於ManyToMany,例如配料,尺寸,種類等。共約14個不同的字段 並非所有的字段都是與每個產品相關。如何在OneToMany/ManyToOne上訂購

我有映射設置了這樣

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; 

這一個多對多/ manyto一個偉大工程。

的問題是在我的product_ingredients表我需要添加一個額外的領域,這意味着需要從多對多切換到一對多/多對一 所以像這樣

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

現在我ProductIngredient實體貌似這個

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

所以在我的產品類物種我使用@ORM \排序依據,這樣的物種已經下令..有一個方法可以讓我好歹也是我的配料場做到這一點?

或者我在做我的邏輯錯誤,這些甚至不應該是產品類中的字段,應該只是由存儲庫查找?

我想它很容易通過我的對象,如$product->getIngredients() 代替,所以我可以循環在產品實體做

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

回答

62

也只是AADD的排序依據的成分關係

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

這將引發錯誤(UNREC可識別的字段:名稱),因爲ProductIngredient中不存在「名稱」它在Ingredient實體中。 – Kris

+0

這是你的其他映射不在這一個失敗... –

+0

你能舉個例子嗎?我的產品實體連接到ProductIngredient,它連接到Ingredient。我嘗試在產品成分類中做orderby,但由於它是一個manytoone,所以它被忽略 – Kris

6

好吧,我想出了一個駭人聽聞的方式..因爲我真的只關心輸出的排序,我做了一個基本的樹枝延伸

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

我想避免這個技巧雖然仍想知道真正的解決

+1

喜歡它,非常方便的有這樣的事情,以防止那些你想要以不同順序排列的隨機時間 – Adam

0

正如我在一個類似的問題被指示,你應該寫一個通過合作,以便連接查詢的ORM順序,請參閱此處以供參考。 http://www.krueckeberg.org/notes/d2.html

然而,我解決我與我的查詢問題種類的插件在客戶端,jQuery的數據表和tinysort都是優秀:-)