Symfony 2,从多对多关联中获取实体


Symfony 2, get entity from Many To Many association

我有实体ProductTires。一个产品有多个轮胎,一个轮胎可以在多个产品上。

在我的控制器中,当我调用
$product = $em->getRepository('MyBundle:Product')->find($id);

$tires = $product->getExtraTires();

Related Tires won't return.

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

我根据理论文档设计实体。当我添加Product并选择轮胎添加时,在连接表中看起来一切正常。

我错过了什么?

编辑

我发现了一些东西,但我不完全明白它是如何工作的:)

在我的控制器,当我得到产品实体与

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

我得进去了product.extraTires.owner.extraTires然后我可以在这里看到相关的轮胎。突然间,我又有一个对数据库的查询。所以我没有在控制器中正确调用它

<<p> 解决方案/strong>似乎控制器中的查询不完整。$tires现在返回轮胎数组,你也可以使用->getValues()方法。
$product = $em->getRepository('MyBundle:Product')->find($id);
$tires = $product->getExtraTires()->toArray();

Doctrine不会自动更新内存中的水合对象。内存中的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;
    }
}