Proxies

De methode EntityManager#getReference($entityName, $identifier) stelt je in staat een referentie naar een entiteit te verkrijgen waarvan alleen de identiteit bekend is, zonder die entiteit te laden vanuit de database. Behalve dat dit prestatie verhogend werkt is dit ook een prima manier om een associatie te maken naar een entiteit waarvan je alleen de identiteit wilt vastleggen in het hoofdobject.

Bijvoorbeeld een product en een aantal categorieen:

De categorieen liggen vast in een aparte tabel en er is een many to one relatie vanuit het object product naar het object categorie

Door de onderliggende relatie tussen categorie_id en de tabel categorie werkt het onderstaande niet:

  $product->setCategorie($data['categorie_id']);

De setCategorie() methode die Doctrine heeft gegenereerd aan de hand van de relaties die je hebt gedefinieerd verwacht namelijk een object als parameter:

    /**
     * Set categorie
     * @param \Producten\ProductBundle\Entity\Categorie $categorie
     * @return Product
     */
    public function setCategorie(\Producten\productBundle\Entity\Categorie $categorie = null)
    {
        $this->categorie = $categorie;
        return $this;
    }

Om een categorie_id in het product object aan te brengen moethet object worden toegevoegd en daarvoor gebruik je een proxy:

    $product->setCategorie( 
      $em->getReference('ProductenProductBundle:Categorie',
      $data['categorie_id']
    );

Maar eenvoudiger is het een aparte methode toe te voegen om het categorie_id bij de persist op te slaan:

    public function setCategorieId($categorie)
    {
        $this->categorie = $categorie;
        return $this;
    }