Доктрина 2, ГДЕ В пункте используется набор сущностей


Я пытаюсь создать запрос в Доктрине 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());
;
Author: Jaik Dean, 2013-08-30

4 answers

Запрос на вытягивание Я сделал об этом, чтобы это было объединено в доктрину ORM 2.5, так что вы можете просто сделать это сейчас:

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

Последняя версия Доктрины теперь допускает параметры сбора и автоматически использует первичный ключ каждой из записей коллекции.

 23
Author: Michaël Perrin, 2016-02-26 10:39:11

Попробуйте установить идентификаторы в качестве параметра

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

Затем

$q = $this->createQueryBuilder('v')
    ->select('v')
    ->andWhere('v.workingHours IN (:workingHours)')
    ->setParameter('workingHours', $ids);
;
 16
Author: Alexey B., 2013-08-30 15:24:47

Я думаю, что 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();
 0
Author: ybert, 2013-08-30 15:18:54

Новое в доктрине 2.5 - ГДЕ В запросе используется коллекция в качестве параметра

Http://doctrine-orm.readthedocs.org/en/latest/changelog/migration_2_5.html#query-api-where-in-query-using-a-collection-as-parameter

 0
Author: patie, 2015-03-11 14:33:28