2014-07-21 2 views
1

quelques questions en ce qui concerne la création d'un one-to-many unidirectionnelle dans Doctrine 2:Doctrine 2 - one-to-Many unidirectionnel

  1. Est une table de jointure nécessaire?
  2. Le docs dit "regarde cet exemple", mais tout ce que je vois est le schéma généré. Quelqu'un fouette un exemple rapide pour que je puisse corriger les annotations?
+0

pouvez-vous essayer sans l'annotation @JoinTable et signaler si cela fonctionne s'il vous plaît? – AlixB

Répondre

1

Vous étiez sur la version 2.0.x du Documentation. Vérifiez this one. Vous aurez l'exemple.

Alors oui, vous pouvez éviter l'annotation dans l'une des deux classes.

+2

Vous pouvez faire un à plusieurs rapports sans utiliser une table de jointure – Alex

+0

vous avez raison. Je pensais à un ManyToMany. – AlixB

+0

pourquoi l'exemple pour le spectacle unidirectionnel OneToMany un ManyToMany? – Scott

0

Non, ce n'est pas le cas. Essayez ceci:

class Foo 
{ 
    public function __construct() 
    { 
     $this->bars = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    /** 
    * @ORM\OneToMany(targetEntity="My\AwesomeBundle\Entity\Bar", mappedBy="foo") 
    */ 
    protected $bars; 
} 

class Bar 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="My\AwesomeBundle\Entity\Foo", inversedBy="bars") 
    */ 
    protected $foo; 
} 
+0

J'essaie d'éviter mes 'Bars' d'avoir à connaître à propos de' Foo' si possible. Si ce n'est pas le cas, que ce soit le cas, mais j'espère un moyen d'y arriver –

+0

Eh bien, je pense que vous pouvez omettre l'annotation, mais la relation ne sera pas unidirectionnelle si je suis correct. Dans le cas où vous ne le souhaitez pas en raison de la perte de couplage entre les bundles, jetez un oeil à [resolve_target_entities] (http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html) –

2

Cela démontre un à plusieurs, par lequel un utilisateur peut avoir de nombreux rapports, et un rapport ne peut appartenir qu'à un seul utilisateur.

class User 
{ 
    // ... 

    /** 
    * @OneToMany(targetEntity="Report", mappedBy="user") 
    */ 
    protected $reports; 

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

    public function addReport(\Namespace\To\Report $report) 
    { 
     $this->report[] = $report; 
    } 

    public function getReports() 
    { 
     return $this->reports; 
    } 
} 

et

class Report 
{ 
    // ... 

    /** 
    * @ManyToOne(targetEntity="User", inversedBy="reports") 
    * @JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    protected $user; 

    public function setUser(\Namespace\To\User $user) 
    { 
     $this->user = $user; 
    } 

    public function getUser() 
    { 
     return $this->user; 
    } 
} 

Dans ce cas, créer un rapport et l'associer à un utilisateur, nous:

// create a User (or find an existing one) 
$user = new User(); 
// create the Report 
$report = new Report(); 
// add the User to the Report 
$report->setUser($user); 
// then persist it, etc ... 
+0

Il demande une association unidirectionnelle . De plus, si je me souviens bien, Doctrine ne vérifiera que le côté propriétaire (Report :: user), donc votre 2ème extrait ne fonctionnera pas. – AlixB

+0

Selon la documentation de Doctrine, une relation un-à-plusieurs doit être bidirectionnelle, sauf si vous utilisez une table de jointure. Cela donne donc une alternative à une table de jointure, comme demandé par l'OP. Cependant, je n'étais pas au courant que add-> report() ne peut pas être appelé. Il semble étrange que Symfony génère ces méthodes si c'est le cas ... – Alex

+0

Ok je n'ai pas bien compris le sujet. Je pensais à une table de jointure dans le SGBD. S'il parle de l'annotation, oui, il en aura besoin, mais encore une fois je ne suis pas sûr de cela, je dois essayer. - addReport peut être appelé mais je pense qu'il va lancer une exception disant que Doctrine a trouvé une nouvelle entité sans persister automatiquement ou qu'elle ne la verra pas. C'est juste parce que la doctrine n'utilise que le côté propriétaire de l'association et User :: report est le côté inverse. – AlixB

0

Cela fonctionne bien avec Doctrine 2 + Zend Framework 2.5 en allant chercher un à plusieurs http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-bidirectional

Dans mon cas, je devais récupérer les produits avec leurs documents (chaque produit minimum 5 Documents)

Le ArrayCollection le fait plutôt bien.

Dans la visionneuse vous avez seulement pour foreach l'objet Product, puis encore une fois foreach $ product-> getDoc() c'est tout.

Questions connexes