列出属于Doctrine中关联的实体

时间:2016-03-17 08:50:31

标签: symfony doctrine dql

我们说我有一个" Person"实体。一个人可以属于" Group"。它们通过 ManyToMany,Join Table 策略关联。

通用代码如下所示:

/**
 * Vendor\AcmeBundle\Entity\Person
 *
 * @ORM\Entity(repositoryClass="Vendor\AcmeBundle\Entity\PersonRepository")
 */
class Person extends BaseUser
{

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @ORM\ManyToMany(targetEntity="Vendor\AcmeBundle\Entity\Group")
 */
protected $groups;

}

和小组实体

/**
 * @ORM\Entity
 */
class Group extends BaseGroup
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string", nullable=true)
     */
    protected $publicName;
    }

我想达到什么目标?

给定一个组,以一致的方式列出属于该组的用户,包括分页选项( aka limit和offset)

这样的事情:

function getUserFromGroup(Group $group, $criteria, $limit, $offset){};

考虑:

  • 实体是可变的,可以调整它们以达到这个必要条件(例如,关联可以从单向转换为双向
  • 人员实体数量为千(2000~8000)
  • 组的数量小于10

2 个答案:

答案 0 :(得分:0)

Symfony2 Book, chapter on Doctrine

中对此进行了解释

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

来自official doctrine documentation

function getUserFromGroup($group, $criteria, $limit, $offset){
    // You should probably build the criteria into a paramaters array,
    // but I'll just asume it's "fieldName" => "valueToFilterBy"
    $criteria['groups'] = $group;

    $users = $em->getRepository('AppBundle\Entity\User')
        ->findBy(
            $criteria, // Filter by columns
            array('name' => 'ASC'), // Sorting
            $limit, // How many entries to select
            $offset   // Offset
        );

    return $users;
};

答案 1 :(得分:0)

我不会使用关联来列出组的成员,而是使用自定义存储库调用。这应该足够接近:

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