Doctrine从集合中获取所有实体

时间:2016-08-19 07:57:52

标签: symfony orm doctrine one-to-many

我不知道我所尝试的是否真的有可能。所以我想问你们。

我想做什么:

  • 获得一组公司
  • 获取与给定公司相关联的所有用户

在代码中:

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

3 个答案:

答案 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();
}

我们将这里的公司表加入用户表,这为我们提供了每个用户的公司。然后,我们过滤掉每个有错误公司的用户。

相关问题