Fixed it, thanks for the pointers!

The ManyToMany in Photo needed an inversedBy :

    /**
     * @ORM\ManyToMany(targetEntity="Tag",inversedBy="photos")
     * @ORM\JoinTable(name="tag_photo_link",
     *      joinColumns={@ORM\JoinColumn(name="tm_photoid", 
referencedColumnName="ph_id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="tm_keywordid", 
referencedColumnName="ta_id")}
     *      )
     **/
    private $tags;

and Tag was looking at the column name not the attribute within the Photo 
entity:

    /**
     * @ORM\ManyToMany(targetEntity="Hotfox\Entity\Photo", mappedBy="tags")
     **/
    private $photos;


Works like a dream now. Thankyou so much!

Cheers

Jess
x




On Thursday, 13 February 2014 09:23:11 UTC, Jess Rowbottom wrote:
>
> Hi all --
>
> I've got a bit of an issue with a double join in Doctrine. This is using 
> Doctrine 2.4 with Zend 2.2, and MySQL 5.5.35.
>
> I have three entities:
> - Sets, which contain photos.
> - Tags, which may have many photos.
> - Photos, which may have many photos associated with them
>
> The issue I have is with this bit of DQL, to get all the tags associated 
> with photos within a set:
>
>   $tagQuery=$entityManager->createQuery("SELECT DISTINCT t
>                                                     FROM Hotfox\Entity\Tag 
> t
>                                                     LEFT JOIN t.photos p
>                                                     LEFT JOIN p.set s
>                                                     WHERE s.id = :set");
>
> However, this then throws an error citing bad SQL generated by the DQL 
> parser:
>
> An exception occurred while executing 'SELECT DISTINCT t0_.ta_id AS ta_id0, 
> t0_.ta_word AS ta_word1, t0_.ta_title AS ta_title2, t0_.ta_date_added AS 
> ta_date_added3, t0_.ta_groupid AS ta_groupid4 FROM tags t0_ LEFT JOIN  LEFT 
> JOIN sets s2_ ON p1_.ph_setid = s2_.se_id WHERE s2_.se_id = ?' with params 
> ["412"]:
>
> SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in 
> your SQL syntax; check the manual that corresponds to your MySQL server 
> version for the right syntax to use near 'LEFT JOIN sets s2_ ON p1_.ph_setid 
> = s2_.se_id WHERE s2_.se_id = '412'' at line 1
>
>
> "LEFT JOIN LEFT JOIN"? It looks like it's not adding the inverse lookup of 
> the many-to-many relationship from the Photos entity.
>
> So far I've regenerated the database from scratch using doctrine-module, 
> checked the entities are created in the database correctly, etc. Pulling 
> tags by photo and photos by set are working fine.
>
> The relationships are defined thus (entities snipped for brevity):
>
> class Tag
> {
>    (....)
>     /**
>      * @var integer
>      *
>      * @ORM\Column(name="ta_id", type="integer", nullable=false)
>      * @ORM\Id
>      * @ORM\GeneratedValue(strategy="IDENTITY")
>      */
>     private $id;
>
>     /**
>      * @ORM\ManyToMany(targetEntity="Hotfox\Entity\Photo", 
> mappedBy="ph_id", cascade={"all"})
>      **/
>     private $photos;
> }
>
> class Photo
> {
>    (...)
>     /**
>      * @var integer
>      *
>      * @ORM\Column(name="ph_id", type="bigint", nullable=false)
>      * @ORM\Id
>      * @ORM\GeneratedValue(strategy="IDENTITY")
>      */
>     private $id;
>
>     /**
>      * @ORM\ManyToOne(targetEntity="Hotfox\Entity\Set")
>      * @ORM\JoinColumns({
>      *   @ORM\JoinColumn(name="ph_setid", referencedColumnName="se_id")
>      * })
>      */
>     private $set;
>
>     /**
>      * @ORM\ManyToMany(targetEntity="Tag")
>      * @ORM\JoinTable(name="tag_photo_link",
>      *      joinColumns={@ORM\JoinColumn(name="tm_photoid", 
> referencedColumnName="ph_id")},
>      *      inverseJoinColumns={@ORM\JoinColumn(name="tm_keywordid", 
> referencedColumnName="ta_id")}
>      *      )
>      **/
>     private $tags;
> }
>
> class Set
> {
>     /**
>      * @var integer
>      *
>      * @ORM\Column(name="se_id", type="bigint", nullable=false)
>      * @ORM\Id
>      * @ORM\GeneratedValue(strategy="IDENTITY")
>      */
>     private $id;
> }
>
> Any clues please?
>
> Cheers
>
> jx
>
>

-- 
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/groups/opt_out.

Reply via email to