2015-07-19 63 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() –