php - 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 对象,而不是结果集,这就是为什么它很棘手。
解决方案
一种将查询所有用户的方法,但会按照您描述的顺序为您提供一个数组:
$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;
}
推荐阅读
- ruby-on-rails - 如何将 ruby 中的实例/访问器变量传递给另一个类并获取存储在相应变量中的数据?
- python - 如何在 python 中删除对象?
- javascript - 仅当表单提交后从另一个路由重定向时才在路由上渲染组件
- amazon-cloudformation - 从 StackA 导入 ALBName 以在 StackB 中使用
- javascript - 如何在javascript中净化创建的结构化json文件的输出?
- c# - 使用 C# 和 System.IO.Compression.ZipArchive 更新现有的 ooxml 文件
- python - 如何使用导入为 linux 用户编写 Python 脚本
- git - Gitlab - 如何在分叉项目中组织分支?
- azure - Azure AD:id_token 作为不记名令牌
- java - 如何使用 ByteBuffer 进行短到 byte[] 的转换?