Как я могу проверить, является ли параметр массива пустым?

0

Я хочу выбрать пользователей из базы данных с помощью 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
doctrine2

2 ответа

1

Вы можете динамически создавать 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-иш.

  • 0
    Я действительно хотел бы избежать динамического построения запроса. Запрос, который я разместил здесь, является только примером запроса, фактический запрос намного больше. Разделив его на несколько частей, становится еще сложнее понять, что происходит.
  • 0
    @ Крис: если вы поставите логику, где бы вы ее ни использовали, понимание будет «трудным». Для меня это решение лучше читаемого и понятного, чем сложный запрос, где, например, вы выбираете все идентификаторы, если массив пуст.
Показать ещё 3 комментария
0

Единственное решение, с которым я столкнулся, - это вычислить счет в 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню