如何通过实体管理器获取上一个和下一个实体



这就是我如何使用用户实体的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()的方法,它只是一个例子,如果存在类似的方法,可以帮助以面向对象的方式直接获得下一个和上一个实体!

将此函数添加到存储库类中

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

通过搜索值大于或小于给定值的所有记录,对它们进行排序,然后只获取第一个或最后一个结果,可以获得上一个和下一个记录。

假设我们有这些ID:

70
80
99
100

为了获得99之前的用户,我们想要id小于99最后一个用户。以下是将其添加到自定义存储库中的代码:

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的记录。

相关内容

  • 没有找到相关文章

最新更新