在 DQL 中使用 ArrayCollection() class 的 contain()

Use contain() of ArrayCollection() class in DQL

我有这个脚本。

它从数据库中获取行并选择属于类别 (CatData) 的行。

getCatDatas() returns \Doctrine\Common\Collections\ArrayCollection() class.

所以可以用contain()来检查。

不过我想把这个方法放到DQL里面,请问有实践吗??

$result = array();
$articles = $em->createQuery("SELECT a FROM DefaultBundle:ArticleData a ")
    ->getResult();

foreach ($articles as $a){// I want to put this function in DQL.
    if ($a->getCatDatas()->contain($cat)){
        array_push($articles,$result);
    }
}

是的,您可以使用 DQL 并对关系执行 where 条件。

您可以在此处找到更多信息:https://symfonycasts.com/screencast/symfony3-doctrine-relations/relation-query

特别是 GenusNoteRepository 中的方法 findAllRecentNotesForGenus

我认为你可以做类似的事情:

public function findPostsByCategoryData(CategoryData $cat)
{
    return $this->createQueryBuilder('a')
        ->andWhere('a.catDatas = :cat')
        ->setParameter('cat', $cat)
        ->getQuery()
        ->execute();
}

@Alessandro Filira 开始的方向是正确的,但忘了考虑这是一个您要过滤的对多关系。

Doctrine 支持 MEMBER OF 运算符,其工作方式有点像 IN 但方向相反。它允许您检查您拥有的特定值是否作为相关组中的元素找到。

所以代码应该是这样的:

public function findPostsByCategoryData(CategoryData $cat): array
{
    return $this->createQueryBuilder('a')
        ->andWhere(':cat MEMBER OF a.catDatas')
        ->setParameter('cat', $cat)
        ->getQuery()
        ->getResult();
}

有关 MEMBER OF 用法,请参阅 Doctrine 文档:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/dql-doctrine-query-language.html(使用 Ctrl+F 和 "member of")