使用findBy访问实体内的ArrayCollection

时间:2015-01-21 23:02:32

标签: mysql symfony doctrine-orm

我正在尝试使用findOneBy从数据库中获取对象,但区分各个对象的对象的标识符位于此类的ArrayCollection成员中。 (不计算身份证)

关系是OneToMany Unidirectional,它使ManyToMany成为JoinTable,现在我知道如何找到一个带有“单变量”成员的对象,如下所示:

$em->getRepository('ExampleEntity')->findOneBy(array('name' => 'example');

有没有人知道如何使用相同的方法访问ArrayCollection变量成员,即使用find *或DQL? CustomRepository?

谢谢。

P.S。我很抱歉,如果已经存在这样的问题,我已经搜索过了。

编辑:

我可能还应该说,ArrayCollection本身就是一个实体,它包含两个字段,名称和数据(我知道,模糊,这是因为实体本身很模糊)

2 个答案:

答案 0 :(得分:0)

如果我理解,你想通过字段找到实体中的arrayCollection字段。以下查询应该有效:

$queryBuilder = $em->getRepository('ExampleEntity')->createQueryBuilder('alias');

return $queryBuilder
   ->where($queryBuilder->expr()->in('alias.arrayField', 'value'))
   ->getQuery()
   ->getResult();

答案 1 :(得分:0)

使用benatespina的答案和答案findBy with JOIN criteria in Symfony2我找到了答案。

你可以通过使用带有连接的DQL来“进入”实体内的任何数组,即

$builder = $entityManager->getRepository('ExampleRepo')->createQueryBuilder(<alias_0>);
$query = $builder
            ->join('<alias_0>.<name_of_your_array_of_entities>', '<alias_1>')
            ->join('<alias_1>.<another_array>', '<alias_2>')
            ->join('<alias_2>.<yet_another_array>', '<alias_3>')
            ->where('<alias_3>.<name_of_your_variable> = :placeholder')
            ->setParameters(array('placeholder' => <variable_value>))
            ->getQuery();

请记住,这可能表现得非常糟糕,说实话,我不知道它的表现如何,所以请自己测试一下。

如果您的结构中有继承,DQL将没有那么有用,您需要做的是获得一个实际的对象您想要检查,使用我刚才显示的方法您,尽可能降低您可以使用数组,并检查您之前获得的实际对象的ID。

像这样:

$object = $entityManager->getRepository('SomeObjectDeepInYourStructure')->findOneBy(array(<criteria>));
$entityManager->getRepository('ExampleRepo')->createQueryBuilder(<alias_0>);
$query = $builder
            ->join('<alias_0>.<lowest_array>', '<alias_1>')
            ->where('<alias_1>.id = :id')
            ->setParameters(array('id' => $object->getId()))
            ->getQuery();

这显然仅在您具有单向关系的场景中才有意义。希望它可以帮助任何有类似问题的人。