jmraz
jmraz

Reputation: 99

Doctrine Query Builder for entities with Join Table

User ---[OneToMany]---> AcquiredSkill ---[ManyToOne]---> Skill

I'm having problems with creating a query using query builder in doctrine. Can someone help me convert this mysql query to a doctrine query using query builder?

SELECT u.*, s.*
FROM `user` u
Join `acquired_skill` ac ON ac.user_id = u.user_id
Join `skill` s ON ac.skill_id = s.skill_id

Tables

user
- user_id
- name
skill
- skill_id
- skill_name
acquired_skill
- as_id
- skill_id
- user_id

So far, this is my query but it lacks the join between the skills.

createQueryBuilder('u')
        ->select('u.user_id', 'u.name')
        ->getQuery()
        ->getResult();

Upvotes: 0

Views: 3050

Answers (2)

Suf_Malek
Suf_Malek

Reputation: 666

        $qb = $this->entity_manager->createQueryBuilder('u');
        $qb->select("*");
        $qb->innerJoin('Namespace\YourBundle\Entity\Aq_skill', 'ac', 'WITH', 'ac.user_id = u.user_id');
        $qb->innerJoin('Namespace\YourBundle\Entity\skill', 's', 'WITH', 'ac.skill_id = s.skill_id');

        $result = $qb->getQuery()->getArrayResult();

Upvotes: 0

M Khalid Junaid
M Khalid Junaid

Reputation: 64496

Your relation seems like you have many-to-many association between user and skills you can set your entities to setup this relation like user entity will point to skill entity in a many-to-many way

User Entity

/**
 * @ORM\ManyToMany(targetEntity="Namespace\YourBundle\Entity\Skill", cascade={"persist"})
 * @ORM\JoinTable(name="acquired_skill",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="skill_id", referencedColumnName="id")}
 * )
 */
private $skills;

Skill Entity

/**
 *
 * @ORM\ManyToMany(targetEntity="Namespace\YourBundle\Entity\User", mappedBy="skills")
 */
private $user;

Now in query builder you can join your user entity with skill like below

$this->createQueryBuilder('u')
        ->select('u')
        ->innerJoin('u.skills','s')
        ->getQuery()
        ->getResult();

for further clarification see docs 22.2.19. @ManyToMany

Upvotes: 1

Related Questions