J'essaie de récupérer les donées de plusieurs tables pour faire un json, mais je suis bloqué pour la jointure sur la table ayant une UniqueConstraint sur 2 clés.

Pour l'instant j'en suis là (je récupère biens les éléments) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$qb = $this->_em->createQueryBuilder()
    ->select('partial s.{id, activity}, partial a.{id, title}, partial p.{id, evaluationType}')
    ->from('Innova\PathBundle\Entity\Step', 's')
    ->leftJoin('s.activity', 'a')    //jointure sur l'entité Activity
    ->leftJoin('a.parameters', 'p')  // jointure sur l'entité ActivityParameters
    ->andWhere('s.path = 2')
;
mais je veux aussi joindre sur l'entité Evaluation :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 * @ORM\Table(
 *     name="claro_activity_evaluation",
 *     uniqueConstraints={
 *         @ORM\UniqueConstraint(
 *             name="user_activity_unique_evaluation",
 *             columns={"user_id", "activity_parameters_id"}
 *         )
 *     }
 * )
 */
class Evaluation
{
    /**
     * @ORM\ManyToOne(targetEntity="Claroline\CoreBundle\Entity\User")
     * @ORM\JoinColumn(onDelete="CASCADE", nullable=false)
     */
    protected $user;
 
    /**
     * @ORM\ManyToOne(targetEntity="Claroline\CoreBundle\Entity\Activity\ActivityParameters")
     * @ORM\JoinColumn(name="activity_parameters_id", onDelete="CASCADE", nullable=false)
     */
    protected $activityParameters;
 
    /**
     * @ORM\Column(name="attempts_count", type="integer", nullable=true)
     */
    protected $attemptsCount;
 
}
Voilà l'entité User :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * @ORM\Table(name="claro_user")
 * @ORM\Entity(repositoryClass="Claroline\CoreBundle\Repository\UserRepository")
 */
class User 
{
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @var string
     *
     * @ORM\Column(name="first_name", length=50)
     * @Assert\NotBlank()
     */
    protected $firstName;
 
}
Voilà l'entité ActivityParameters

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 * @ORM\Entity
 * @ORM\Table(name="claro_activity_parameters")
 */
class ActivityParameters
{
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @var \Claroline\CoreBundle\Entity\Resource\Activity
     *
     * @ORM\OneToOne(
     *     targetEntity="Claroline\CoreBundle\Entity\Resource\Activity",
     *     mappedBy="parameters"
     * )
     * @ORM\JoinColumn(name="activity_id", onDelete="CASCADE", nullable=true)
     */
    protected $activity;
 
    /**
     * @var string
     *
     * @ORM\Column(name="evaluation_type", nullable=true)
     */
    protected $evaluationType;
 
    /**
     * @return string
     */
    public function getEvaluationType()
    {
        return $this->evaluationType;
    }
}
Voilà l'entité Activity

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * @ORM\Table(name="claro_activity")
 */
class Activity
{
    /**
     * @var string
     * @ORM\Column(length=255, nullable=true)
     */
    protected $title;
 
    /**
     * @ORM\OneToOne(
     *     targetEntity="Claroline\CoreBundle\Entity\Activity\ActivityParameters",
     *     inversedBy="activity",
     *     cascade={"persist"}
     * )
     * @ORM\JoinColumn(name="parameters_id", onDelete="cascade", nullable=true)
     */
    protected $parameters;
 
    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
}
Je ne vois pas comment modifier cette querybuilder pour récupérer les données de Evaluation. Je souhaiterais quelque chose comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
$qb = $this->_em->createQueryBuilder()
    ->select('partial s.{id, activity}, partial a.{id, title}, partial p.{id, evaluationType}, e')
    ->from('Innova\PathBundle\Entity\Step', 's')
    ->leftJoin('s.activity', 'a')   
    ->leftJoin('a.parameters', 'p')  
    ->andWhere('s.path = 2')
    ->leftJoin('je-ne-sais-pas-quoi', 'e')  <<====
    ->andWhere('e.user = 3')      //données pour un utilisateur spécifique
;
Merci d'avance pour les idées, suggestion