web-dev-qa-db-de.com

Doctrine 2 WHERE IN-Klausel mit einer Sammlung von Entitäten

Ich versuche in Doctrine 2 eine Abfrage zu erstellen, die alle Vacancy-Entitäten findet, die mit den angegebenen VacancyWorkingHours-Entitäten zusammenhängen.

Die Vacancy-Entität sieht folgendermaßen aus:

/**
 * 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 */
}

Meine Abfrage sieht derzeit wie folgt aus, gibt jedoch aufgrund der where-Klausel keine Ergebnisse zurück. In diesem Beispiel ist $workingHours eine Doctrine\Common\Collections\ArrayCollection-Instanz, die eine Anzahl von VacancyWorkingHours-Entitäten enthält

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

Eine Pull-Anfrage , die ich dazu gemacht habe, wurde in Doctrine ORM 2.5 zusammengeführt. Sie können dies nun einfach tun:

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

Die neueste Version von Doctrine erlaubt jetzt Collection-Parameter und verwendet automatisch den Primärschlüssel aller Collection-Einträge.

25
Michaël Perrin

Versuchen Sie, IDs als Parameter festzulegen

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

Dann

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

Ich denke, dass DQL dafür besser funktionieren wird.

$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