首页 > 解决方案 > Doctrine ORM - 如何在选择查询中选择第一个选定的项目

问题描述

我正在使用带有 EasyAdmin 的 Symfony 4,我需要进行选择查询来检索所有用户,但我希望选择连接的用户作为第一个结果。

我完全不知道该怎么做。我在想也许在同一个查询中进行多项选择?但我什至不知道该怎么做。

到目前为止,我有这个:

   $repo = $this->getDoctrine()->getRepository(User::class);
   $authUser = $this->getUser();
   $queryBuilder = $repo->createQueryBuilder('u');
   return $queryBuilder;

// 教义 createQueryBuilder 看起来像这样

  public function createQueryBuilder($alias, $indexBy = null)
        {
            return $this->_em->createQueryBuilder()->select($alias)->from($this->_entityName, $alias, $indexBy);
        }

编辑:我必须返回 queryBuilder 对象,而不是结果集,这就是为什么它很棘手。

标签: phpsymfonydoctrine-orm

解决方案


一种将查询所有用户的方法,但会按照您描述的顺序为您提供一个数组:

$users = $userRepository->findall();
foreach ($users as $user) {
    $this->getUser() == $user ? $currentUser[] = $user : $otherUsers[] = $user;
}
$myUserList = array_merge($currentUser, $otherUsers);

两个旁注:1:这会查询所有用户,然后将它们拆分。我不确定这是否是你想要的。2:如果当前没有用户登录,此代码将不起作用,因为$currentUser不会被定义。当然,您可以更改它,以便在没有用户登录时也可以使用。

基于返回查询构建器是必要的事实进行编辑:

您可以使用CASE来测试和创建一个属性,您可以AS HIDDEN在查询中隐藏它,然后按此隐藏属性排序,如下所示:

public function currentUserFirst($userId){
    $qb = $this->createQueryBuilder('u')
        ->select('u, CASE WHEN u.id = :userId THEN 0 ELSE 1 END AS HIDDEN order')
        ->setParameter('userId', $userId)
        ->orderBy('order', 'ASC');
    return $qb;
}

推荐阅读