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());
;
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.
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);
;
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();
de neuf dans Doctrine 2.5 - Requête WHERE IN utilisant une collection en tant que paramètre