我不知道我所尝试的是否真的有可能。所以我想问你们。
我想做什么:
在代码中:
executeUpdate
它们的关联方式如下:
$companyIds = array(1,2,3);
$companies = $this->em->getRepository('AppBundle:Company')->findById($companyIds);
dump($companies->getUsers()); // this will not work, but I like it to work
答案 0 :(得分:3)
Repository会返回ArrayCollection
个实体,而不是单个实体,因此您需要分别访问每个实体。
这应该有效:
foreach($companies as $company) {
$company->getUsers();
}
上面的问题是,默认情况下,它会在单独的查询中为每个公司从数据库中提取(延迟加载)用户(在调用getUsers
时按需),这在大规模上效率非常低。 / p>
根据您的需要,有几种可能的解决方案。
您可以将doctrine配置为始终使用公司获取用户,这称为eager fetch。
获取用户后,您可以合并ArrayCollections(并在需要时删除重复项),以实现包含所有用户的单个集合。
其他方式可以是通过在您公司的存储库的自定义方法中创建足够的DQL查询来获取用户公司。如果您只需要用户而且不需要公司,那么它可能是一个仅在没有公司的情况下提取用户的查询。
答案 1 :(得分:1)
你可以,例如使用一个查询的用户获取所有Comapany
个实体:
$companies = $em->createQueryBuilder()
->select('c, u')
->from('AppBundle:Company', 'c')
// or left join based on you needs
->innerJoin('c.users', 'u')
->getQuery()
->getResult();
获取公司用户时不会导致查询。
答案 2 :(得分:1)
在用户存储库中尝试这样的事情:
public function getAllUsersFromCompanies($ids)
{
$qb = $this->createQueryBuilder('u');
$qb->leftJoin('u.company', 'c')
->where('c.id IN :ids')
->setParameter('ids', $ids)
->getQuery();
return $query->getResult();
}
我们将这里的公司表加入用户表,这为我们提供了每个用户的公司。然后,我们过滤掉每个有错误公司的用户。