Thanks Matthew. This is exactly what I meant. The stuff is working 
perfectly (with some adjustment).

Shame it cannot be achieved without 3rd entity though.

Have a nice day/evening/night!

Best wishes,
V.

On Wednesday, January 21, 2015 at 11:14:15 PM UTC+1, Matthew Stuart wrote:
>
> Really this sounds a little like what you want are OneToMany relationships 
> between Location -> Vote and Article -> Vote BUT you can use inheritance to 
> manage things properly.
>
> Something like:
>
> I'm using the following without issue:
> <?php
>
> abstract class EntitAbstract
> {
>     public function __get($name) { return $this->$name; }
>     public function __set($name, $value) { $this->$name = $value; }
>     public function __call($name, $args) { /* .. some nice logic to make 
> getters & setters work wonders .. */ }
>     /* .. other nice common helper functions .. **/
> }
>
> /** @appropriate namespace and use statements@ **/
>
> /**
>  * @ORM\Table(name="location")
>  * @ORM\Entity
>  * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
>  */
> class Location extends EntityAbstract
> {
>     /* ... */
>     
>     /**
>      * @var ArrayCollection
>      * @ORM\OneToMany(targetEntity="VoteLocation", mappedBy="location")
>      */
>     protected $votes;
>
>     public function __construct()
>     {
>         parent::__construct();
>         $this->votes = new ArrayCollection();
>     }
> }
>
> /**
>  * @ORM\Table(name="article")
>  * @ORM\Entity
>  * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
>  */
> class Article extends EntityAbstract
> {
>     /* ... */
>     
>     /**
>      * @var ArrayCollection
>      * @ORM\ManyToMany(targetEntity="VoteArticle", mappedBy="article")
>      */
>     protected $votes;
>
>     public function __construct()
>     {
>         parent::__construct();
>         $this->votes = new ArrayCollection();
>     }
> }
>
> /**
>  * @ORM\Table(name="vote")
>  * @ORM\Entity
>  * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
>  * @ORM\InheritanceType("SINGLE_TABLE")
>  * @ORM\DiscriminatorColumn(name="_discr", type="string", length=10)
>  * @ORM\DiscriminatorMap({
>  *   "location" = "VoteLocation",
>  *   "article"  = "VoteArticle",
>  * })
>  *
>  */
> class Vote extends EntityAbstract
> {
>     /* .. your COMMON fields go here .. */
> }
>
> /**
>  * @ORM\Entity
>  * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
>  */
> class VoteLocation extends Vote
> {
>     /**
>      * @var Location
>      * @ORM\ManyToOne(targetEntity="Location", inversedBy="votes")
>      */
>     protected $location;
> }
>
> /**
>  * @ORM\Entity
>  * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT")
>  */
> class VoteArticle extends Vote
> {
>     /**
>      * @var Article
>      * @ORM\ManyToOne(targetEntity="Article", inversedBy="votes")
>      */
>     protected $artcile;
> }
>
>  
> /* To use this wonderful stuff */
>
> $location = LoadEntity('Location', $id);
> // Returns an ArrayCollection of VoteLocation entities
> $votes = $location->votes;
> // Returns the integer (this is the same as calling $votes->count() after 
> the above line)
> $voteCount = $location->votes->count(); 
> // etc..
>
>
> /* The same can be repeated for article.. */
> $article = LoadEntity('Article', $id);
> // Returns an ArrayCollection of VoteLocation entities
> $votes = $article->votes;
> // Returns the integer (this is the same as calling $votes->count() after 
> the above line)
> $voteCount = $article->votes->count(); 
> // etc..
>
> /* Say you have a specific vote.. */
> $vote = LoadEntity('Vote', $id); // Notice I asked for the BASE entity 
> Vote instead of the spcific ones, through the magic of the ORM it will 
> automatically create the appropriate sub entity for me
> // You can now use a switch to determine the kind of vote that it is.. or 
> we can add a helper function to the Vote* classes:
>     class VoteLocation ...
>     {
>         // ....
>         public function getParent()
>         {
>             return $this->location;
>         }
>     }
> // Now we can do:
> $parent = $vote->getParent(); // Now we'll have a reference to the parent, 
> you'll still need to check at some point what kind of class it is though to 
> do anything intelligent with it
>
> /* Creation of a new vote.. */
> $location = LoadEntity('Location', $id);
>
> $vote = new VoteLocation();
> $vote->location = $location;
> $vote->dataPoint = $dataValue;
> /* etc etc */
> $em->persist($vote);
> $location->votes->add($vote);
>
>
> Be aware you should probably have a bunch of setters / helper functions 
> that are doing validation on your values to ensure you don't create a 
> VoteArticle and attempt to assign an article too it. Either way this should 
> probably work for you.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to