我们说我有一个" 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){};
考虑:
答案 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();
}
}