Я хочу выбрать пользователей из базы данных с помощью Doctrine и Symfony. В зависимости от того, есть ли у меня предоставленный список идентификаторов пользователей, я хочу только выбрать пользователей с этими идентификаторами. Если список пуст, необходимо выбрать всех пользователей.
Вот код, который я создал до сих пор:
class UserRepository extends EntityRepository {
public function selectUsers (array $userIds) {
$dql = "
SELECT
u
FROM
MyBundle:User
WHERE
u.id IN (:users)"; // OR (:users) does not contain any values
$query = $this
->getEntityManager()
->createQuery($dql)
->setParameter("users", $userIds);
return $query->getResult();
}
}
Как проверить, пуст ли массив? До сих пор я пробовал IS EMPTY
, =()
, = []
, SIZE(:users) = 0
, COUNT(:users) = 0
но все они дают мне ошибки. Какой здесь правильный синтаксис?
Вы можете динамически создавать DQL-запрос
public function selectUsers(array $userIds)
{
$dql = "SELECT u FROM MyBundle:User";
$params = array();
if ($users) {
$dql .= " WHERE u.id IN (:users)";
$params["users"] = $userIds;
}
return $this->getEntityManager()->createQuery($dql)->execute($params);
}
Вы создаете два разных запроса - выберите все, выберите конкретных пользователей. Я думаю, вы не можете построить такой SQL-запрос. Возможно, у DQL есть ярлык, как вы можете это сделать, но я бы предпочел синтаксис SQL-иш.
Единственное решение, с которым я столкнулся, - это вычислить счет в PHP и передать его в качестве дополнительного параметра.
class UserRepository extends EntityRepository {
public function selectUsers (array $userIds) {
$dql = "
SELECT
u
FROM
MyBundle:User
WHERE
u.id IN (:users) OR :userCount = 0";
$query = $this
->getEntityManager()
->createQuery($dql)
->setParameter("users", $userIds)
->setParameter("userCount", count($userIds));
return $query->getResult();
}
}
Тем не менее, я с трудом верю, что это невозможно сделать непосредственно в DQL.