我正在尝试使用findOneBy从数据库中获取对象,但区分各个对象的对象的标识符位于此类的ArrayCollection成员中。 (不计算身份证)
关系是OneToMany Unidirectional,它使ManyToMany成为JoinTable,现在我知道如何找到一个带有“单变量”成员的对象,如下所示:
$em->getRepository('ExampleEntity')->findOneBy(array('name' => 'example');
有没有人知道如何使用相同的方法访问ArrayCollection变量成员,即使用find *或DQL? CustomRepository?
谢谢。
P.S。我很抱歉,如果已经存在这样的问题,我已经搜索过了。
编辑:
我可能还应该说,ArrayCollection本身就是一个实体,它包含两个字段,名称和数据(我知道,模糊,这是因为实体本身很模糊)
答案 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();
这显然仅在您具有单向关系的场景中才有意义。希望它可以帮助任何有类似问题的人。