这就是我能够使用它的id获取用户实体的方式:
$userEntity = $em->getRepository('ModelBundle:User')->find($userId);
有没有办法根据这个$ userEntity获取上一个和下一个实体?
例如:我获取$ userEntity并且它的id为100,现在我想要获取前一个实体,无论它的id为99,80,70,无论它是什么!与下一个实体的情况相同..
我已经可以使用一些PHP黑客获取下一个和上一个,但是我正在寻找更好的方法..
编辑: 只是为了澄清我正在寻找面向对象的方法,如下所示:
$userEntity = $em->getRepository('ModelBundle:User')->find($userId);
$previousUserEntity = $userEntity->previous(); //example
$previousUserEntity = $userEntity->next(); //example
我知道userEntity不包含任何方法,如previous()和next(),它只是一个例子,如果存在任何类似的东西,它可以帮助以面向对象的方式直接获得下一个和前一个实体!
答案 0 :(得分:6)
将此funstion添加到您的存储库类
public function previous(User $user)
{
return $this->getEntityManager()
->createQuery(
'SELECT u
FROM ModelBundle:User u
WHERE u.id = (SELECT MAX(us.id) FROM ModelBundle:User us WHERE us.id < :id )'
)
->setParameter(':id', $user->getId())
->getOneOrNullResult();
}
public function next(User $user)
{
return $this->getEntityManager()
->createQuery(
'SELECT u
FROM ModelBundle:User u
WHERE u.id = (SELECT MIN(us.id) FROM ModelBundle:User us WHERE us.id > :id )'
)
->setParameter(':id', $user->getId())
->getOneOrNullResult();
}
答案 1 :(得分:4)
通过搜索值大于或小于给定值的所有记录,可以获取上一个和下一个记录,对它们进行排序,然后只获取第一个或最后一个结果。
假设我们有这些ID:
70
80
99
100
为了在99
之前吸引用户,我们希望 last 用户id
小于99
。以下是在custom repository中添加此内容的代码:
public function getPreviousUser($userId)
{
$qb = $this->createQueryBuilder('u')
->select('u')
// Filter users.
->where('u.id < :userId')
->setParameter(':userId', $userId)
// Order by id.
->orderBy('u.id', 'DESC')
// Get the first record.
->setFirstResult(0)
->setMaxResults(1)
;
$result = $qb->getQuery()->getOneOrNullResult();
}
在控制器中:
$em->getRepository('ModelBundle:User')->getPreviousUser($userId);
这将返回ID为80
的记录。
为了在99
之后吸引用户,我们希望id
大于99
的第一个用户:
public function getNextUser($userId)
{
$qb = $this->createQueryBuilder('u')
->select('u')
->where('u.id > :userId')
->setParameter(':userId', $userId)
->orderBy('u.id', 'ASC')
->setFirstResult(0)
->setMaxResults(1)
;
$result = $qb->getQuery()->getOneOrNullResult();
}
在控制器中:
$em->getRepository('ModelBundle:User')->getNextUser($userId);
这将返回ID为100
的记录。