2015-07-19 65 views
1

我有實體ProductTires。 一個產品有更多的輪胎和一個輪胎可以在更多的產品。Symfony 2,從多對多協會獲得實體

在我的控制器當我打電話

$product = $em->getRepository('MyBundle:Product')->find($id); 

$tires = $product->getExtraTires(); 

相關輪胎將不會返回。

/** 
* Product 
* 
* @ORM\Table(name="product") 
* @ORM\Entity 
*/ 

class Product { 

    public function __construct() 
    { 
     $this->extraTires = new ArrayCollection(); 
    } 

    /** 
    * @ORM\ManyToMany(targetEntity="Tires", mappedBy="products") 
    * @ORM\JoinTable(name="product_tires", 
    *  joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="tires_id", referencedColumnName="id")}) 
    */ 
    private $extraTires; 

    /** 
    * Get extraTires 
    * 
    * @return ArrayCollection 
    */ 
    public function getExtraTires() 
    { 
     return $this->extraTires; 
    } 

    /** 
     * Add extraTires 
     * 
     * @param Tires $extraTires 
     * @return Product 
     */ 

     public function addExtraTire(Tires $extraTires) 
     { 
      $this->extraTires[] = $extraTires; 

      return $this; 
     } 

    /** 
     * Remove extraTires 
     * 
     * @param \Wielton\WieltonBundle\Entity\Tires $extraTires 
     */ 
     public function removeExtraTire(Tires $extraTires) 
     { 
      $this->extraTires->removeElement($extraTires); 
     } 

我的輪胎實體

/** 
* Tires 
* 
* @ORM\Table(name="Tires") 
* @ORM\Entity 
*/  
class Tires { 

    public function __construct() 
    { 
     $this->products = new ArrayCollection(); 
    } 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="Product", inversedBy="extraTires") 
    * @ORM\JoinTable(name="product_tires", 
    *  joinColumns={@ORM\JoinColumn(name="tires_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}) 
    */ 
    private $products; 

    /** 
    * Add products 
    * 
    * @param Product $products 
    * @return Tires 
    */ 
    public function addProduct(Product $products) 
    { 
     $this->products[] = $products; 

     return $this; 
    } 

    /** 
    * Remove products 
    * 
    * @param Product $products 
    */ 
    public function removeProduct(Product $products) 
    { 
     $this->products->removeElement($products); 
    } 

    /** 
    * Get products 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getProducts() 
    { 
     return $this->products; 
    } 

我根據doctrine doctumentation設計實體。當我添加產品並選擇輪胎時,在連接表中添加所有內容看起來都不錯。

我錯過了什麼?

編輯

我發現了一些東西,但我不完全瞭解它是如何工作:)

在我的控制器時,即時得到產品實體

$product = $em->getRepository('MyBundle:Product')->find($id); 

我有去樹枝 product.extraTires.owner.extraTires 然後我可以在這裏看到我的相關輪胎。突然之間,我又對數據庫進行了一次查詢。所以不知何故,我沒有正確地在控制器中調用它。

解決方案 好像在控制器中的查詢不完整。 $tires現在返回輪胎數組,也可以使用 - > getValues()方法。

$product = $em->getRepository('MyBundle:Product')->find($id); 
$tires = $product->getExtraTires()->toArray(); 
+0

看起來像你的測試代碼如何? –

+0

林不知道功能測試會在這裏有什麼好處。我試圖做出這種基調,但它只是返回與輪胎的空陣列http://symfony.com/doc/current/cookbook/testing/doctrine.html –

+0

只是一個愚蠢的問題,但你有數據庫中的「輪胎」?你的課「累」有'@ORM \ Entity'註解? – zilongqiu

回答

0

原則不會自動更新內存中的水合物。內存中的PHP對象不會包含更新的關係,除非您再次從數據庫中提取水分,或者您自己更新內存中的表示。

嘗試修改加法器這樣(我就讓你看看如何做到這一點的去除,但它同樣的想法):

產品:

class Product 
{ 

    public function addExtraTire(Tires $extraTires) 
    { 
     $this->extraTires[] = $extraTires; 

     if (!$extraTires->getProducts()->contains($this) { 
      $extraTires->addProduct($this); 
     } 

     return $this; 
    } 
} 

輪胎:

class Tires 
{ 
    public function addProduct(Product $products) 
    { 
      $this->products[] = $products; 

      if (!$products->getExtraTires()->contains($this) { 
       $products->addExtraTire($this); 
      } 

      return $this; 
    } 
} 
+0

謝謝,現在它的工作,即使沒有 - > toArray() –