web-dev-qa-db-fra.com

Doctrine 2 clause WHERE IN utilisant une collection d'entités

J'essaie de créer une requête dans Doctrine 2 qui trouve toutes les entités Vacancy qui sont liées à l'une des entités VacancyWorkingHours données.

L'entité Vacancy se présente comme suit:

/**
 * Vacancy
 *
 * @ORM\Table(name="vacancy")
 * @ORM\Entity(repositoryClass="JaikDean\CareersBundle\Entity\VacancyRepository")
 */
class Vacancy
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var VacancyWorkingHours
     *
     * @ORM\ManyToOne(targetEntity="VacancyWorkingHours", inversedBy="vacancies")
     * @ORM\JoinColumn(name="vacancy_working_hours_id", referencedColumnName="id")
     **/
    private $workingHours;

    /* Other fields and methods are inconsequential */
}

Ma requête ressemble actuellement à ce qui suit, mais ne renvoie aucun résultat en raison de la clause where. Dans cet exemple, $workingHours est une instance Doctrine\Common\Collections\ArrayCollection contenant plusieurs entités VacancyWorkingHours.

$q = $this->createQueryBuilder('v')
    ->select('v')
    ->andWhere('v.workingHours IN (:workingHours)')
    ->setParameter('workingHours', $workingHours->toArray());
;
18
Jaik Dean

Une demande pull que j'ai faite à ce sujet a été fusionnée dans Doctrine ORM 2.5, vous pouvez donc le faire maintenant:

$q = $this->createQueryBuilder('v')
    ->select('v')
    ->andWhere('v.workingHours IN (:workingHours)')
    ->setParameter('workingHours', $workingHours);
;

La dernière version de Doctrine autorise désormais les paramètres de collection et utilisera automatiquement la clé primaire de chacune des entrées de collection.

25
Michaël Perrin

Essayez de définir les identifiants comme paramètre

$ids = array();
foreach($workingHours as $w) {
    $ids[] = $w->getId();
}

Ensuite

$q = $this->createQueryBuilder('v')
    ->select('v')
    ->andWhere('v.workingHours IN (:workingHours)')
    ->setParameter('workingHours', $ids);
;
17
Alexey B.

Je pense que le DQL fonctionnera mieux pour cela.

$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
    'SELECT v
    FROM YourAppYourBundle:YourEntity v // exemple AcmeexampleBundle:YourEntity
    WHERE v.workingHours IN :workingHours'
)->setParameter('workingHours', $workingHours->toArray());

$vacancies = $query->getResult();
0
ybert
0
patie