Doctrine ORM - Как выбрать первый выбранный элемент в запросе выбора - PullRequest
1 голос
/ 19 июня 2019

Я использую Symfony 4 с EasyAdmin, и мне нужно сделать запрос на выборку, который извлекает всех пользователей, но я хочу, чтобы в качестве первого результата был выбран подключенный пользователь.

Я не знаюкак действовать вообще.Я думал, может быть, сделать множественный выбор в одном запросе?но я даже не знаю, как это сделать.

Пока у меня есть это:

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

// Doctrine createQueryBuilder выглядит так

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

РЕДАКТИРОВАТЬ: мне обязательно нужно вернуть объект queryBuilder, а не набор результатов, поэтому это сложно.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Подход, который будет запрашивать у всех пользователей , но даст вам массив в порядке, который вы описываете:

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

Два sidenotes: 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;
}
1 голос
/ 19 июня 2019

Как указано в первом комментарии, вам нужно будет использовать UNION, который не поддерживается в DQL.

Поэтому ваш единственный вариант - использовать собственный запрос, используя 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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...