Doctrine 2 WHERE IN, используя набор объектов
Я пытаюсь построить запрос в Doctrine 2, который находит все Vacancy
сущности, которые связаны с любым из данных сущностей VacancyWorkingHours
.
Объект Vacancy
выглядит следующим образом:
/**
* 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 */
}
В настоящее время мой запрос выглядит следующим образом, но не возвращает результатов из-за предложения where. В этом примере $workingHours
является экземпляром Doctrine\Common\Collections\ArrayCollection
, содержащим число VacancyWorkingHours
сущностей
$q = $this->createQueryBuilder('v')
->select('v')
->andWhere('v.workingHours IN (:workingHours)')
->setParameter('workingHours', $workingHours->toArray());
;
Ответы
Ответ 1
A тянуть запрос Я сделал об этом, который был объединен с Doctrine ORM 2.5, поэтому вы можете просто сделать это сейчас:
$q = $this->createQueryBuilder('v')
->select('v')
->andWhere('v.workingHours IN (:workingHours)')
->setParameter('workingHours', $workingHours);
;
Последняя версия Doctrine теперь позволяет параметры коллекции и автоматически использует первичный ключ каждой записи коллекции.
Ответ 2
Попробуйте установить идентификаторы в качестве параметра
$ids = array();
foreach($workingHours as $w) {
$ids[] = $w->getId();
}
Тогда
$q = $this->createQueryBuilder('v')
->select('v')
->andWhere('v.workingHours IN (:workingHours)')
->setParameter('workingHours', $ids);
;
Ответ 3
Я думаю, что DQL будет работать лучше для этого.
$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();
Ответ 4
new в Doctrine 2.5 - WHERE IN Запрос с использованием коллекции в качестве параметра
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/changelog/migration_2_5.html#query-api-where-in-query-using-a-collection-as-parameter