我将Symfony 4与EasyAdmin一起使用,我需要进行选择查询以检索所有用户,但是我希望选择连接的用户作为第一个结果。
我根本不知道如何进行。我在想也许在同一查询中选择多个?但我什至不知道该怎么做。
到目前为止,我有这个:
$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对象,而不是结果集,这就是为什么它很棘手的原因。
答案 0 :(得分:1)
如第一条评论所述,您将需要使用UNIQ,DQL不支持该UNION。
因此,您唯一的选择是使用需要从Connection
获取的EntityManager
进行本机查询。
它看起来像这样:
$id = $this->getUser()->getId();
$sql = 'SELECT * FROM `users` WHERE `id` = :id UNION SELECT * FROM `users` WHERE`id` != :id'
$users = $this->getDoctrine()->getConnection()->fetchAll($sql, compact('id'));
答案 1 :(得分:1)
一种可以查询所有用户的方法,但是会按照您描述的顺序为您提供一个数组:
$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;
}
答案 2 :(得分:0)
您可以使用setMaxResults:
$qb->andWhere('q.start <= :start')
->setParameter(':start', $value)
->setMaxResults(1)
;