Symfony 在条令中列出属于协会的实体

Symfony 在条令中列出属于协会的实体,symfony,doctrine,dql,Symfony,Doctrine,Dql,假设我有一个“人”实体。一个人可以属于一个“群体”。它们通过多个联接表策略进行关联 一般代码如下所示: function getUserFromGroup(Group $group, $criteria, $limit, $offset){}; /** *供应商\AcmeBundle\Entity\Person * *@ORM\Entity(repositoryClass=“Vendor\AcmeBundle\Entity\PersonRepository”) */ 类Person扩展Base

假设我有一个“人”实体。一个人可以属于一个“群体”。它们通过多个联接表策略进行关联

一般代码如下所示:

function getUserFromGroup(Group $group, $criteria, $limit, $offset){};
/**
*供应商\AcmeBundle\Entity\Person
*
*@ORM\Entity(repositoryClass=“Vendor\AcmeBundle\Entity\PersonRepository”)
*/
类Person扩展BaseUser
{
/**
*@ORM\Column(type=“integer”)
*@ORM\Id
*@ORM\GeneratedValue(strategy=“AUTO”)
*/
受保护的$id;
/**
*@ORM\ManyToMany(targetEntity=“Vendor\AcmeBundle\Entity\Group”)
*/
受保护的群体;
}
以及集团实体

/**
*@ORM\Entity
*/
类组扩展了基组
{
/**
*@ORM\Id
*@ORM\Column(type=“integer”)
*@ORM\GeneratedValue(strategy=“AUTO”)
*/
受保护的$id;
/**
*@ORM\Column(type=“string”,nullable=true)
*/
受保护的$publicName;
}
我想要实现什么?

给定一个组,以一致的方式列出属于该组的用户,包括分页选项(也称为限制和偏移)

大概是这样的:

function getUserFromGroup(Group $group, $criteria, $limit, $offset){};
注意事项:

  • 实体是可变的,它们可以进行调整以实现这一要求(例如,关联可以从单向更改为双向)
  • 个人实体的数量以千为单位(2000~8000)
  • 组的数量少于10个
    • 这在

      对于您的情况,我建议使用
      findBy()
      方法

      从:

      函数getUserFromGroup($group、$criteria、$limit、$offset){ //您可能应该将条件构建到paramaters数组中, //但我会告诉你这是“fieldName”=>“valueToFilterBy” $criteria['groups]=$group; $users=$em->getRepository('AppBundle\Entity\User') ->芬德比( $criteria,//按列筛选 数组('name'=>'ASC'),//排序 $limit,//要选择的条目数 $offset//offset ); 返回$users; };
      我不会使用关联来列出组的成员,而是使用自定义存储库调用。这应该足够接近:

      class PersonRepository extends EntityRepository
      {
          public function findPeopleInGroup(Group $group, $criteria, $limit, $offset){
              $qb = $this->createQueryBuilder('p');
              $qb->join('p.groups', 'g')
              ->where(':group MEMBER OF p.groups')
              ->setParameter('group', $group)
              ->orderBy('p.'.$criteria);
      
              $qb->setFirstResult($offset);
              $qb->setMaxResults($limit);
      
              return $qb->getQuery()->getResult();
          }
      }
      

      是的,但是你忽略了重要的部分:这10个用户必须属于提供的组:$group,它不是字符串,它是一个实体,它通过第三个表(联接表)与之相关,所以我猜它需要一些DQL voodooFirst参数按属性过滤。因此,您正在选择User类型的实体,并按其组对其进行筛选。我将扩展这个示例。我重复一遍,“Person”表中没有名为“group”的列,它是通过联接表的关联。啊,我知道问题出在哪里了。你在“表”和“列”中思考。在使用ORM时,您应该考虑对象和属性。忽略join列,它会自动为您处理。您的个人实体具有“groups”属性,“getGroups”将自动获取这些组。DQL语句还将自动理解如何处理联接表。第二段:我想我或多或少理解DQL,但在哪里设置了要查找“Person”实体的设置?当您使用PersonRepository并在其中创建查询生成器时,它默认检索基础实体的实例。如果您愿意,您可以指定并添加
      ->select('p')
      。谢谢,我想象其中包含了一些“默认魔法”,但我想确定一下。我将对您的解决方案运行一些测试。:)\条令\ORM\EntityManager::createQueryBuilder()不接受任何参数,但如果将其更改为
      $this->createQueryBuilder('p')(\doctor\ORM\EntityManager::createQueryBuilder($alias))没问题:)我正在彻底尝试。看起来不错。我可能会接受它(别担心,我不会忘记),但我会确保它确实有效,我不想以后“拒绝”它:(