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

I have entity Product and Tires. One Product has more Tires and one Tire can be on more Products.

In my controller when I call

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

or

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

And my Tires entity

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

I designed entities according doctrine doctumentation. When I add Product and choose tires to add everything looks ok in join table.

What am I missing?

EDIT

I found something, but I don't fully understand how does it work :)

In my controller when Im getting Product entity with

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

I have to go in twig into product.extraTires.owner.extraTires And then I can see my associated tires here. And suddenly I have one more query to the database. So somehow I'm not calling it in controller properly.

SOLUTION Seems like query in controller wasn't complete. $tires now return array of tires, you can also use ->getValues() method.

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

Doctrine will not update automatically the in-memory hydrated object. The in-memory PHP object will not contain updated relation until you hydrate it again from the database or you update the in-memory representation yourself.

Try to modify adders like the following (I let you look how to do that for the removers but it's the same idea):

Product:

class Product
{

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

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

        return $this;
    }
}

Tires:

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

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

            return $this;
    }
}