簡體   English   中英

Doctrine 2 WHERE IN 子句使用實體集合

[英]Doctrine 2 WHERE IN clause using a collection of entities

我正在嘗試在 Doctrine 2 中構建一個查詢,以查找與任何給定VacancyWorkingHours實體相關的所有Vacancy實體。

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

我就此提出的拉取請求已合並到 Doctrine ORM 2.5 中,因此您現在可以簡單地執行以下操作:

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

最新版本的 Doctrine 現在允許使用集合參數,並將自動使用每個集合條目的主鍵。

嘗試將 ID 設置為參數

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

然后

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

我建議以這種方式使用 DQL:

$qb = $this->createQueryBuilder('v')
    ->andWhere($qb->expr()->in('v.workingHours', $ids));
;

讓 Doctrine 為您處理表達式和引用工作。

我認為 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM