原则ORM-如何在选择查询中选择第一个选择的项目

时间:2019-06-19 14:20:19

标签: php symfony doctrine-orm

我将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对象,而不是结果集,这就是为什么它很棘手的原因。

3 个答案:

答案 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)
    ;