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();