如何检查数组参数是否为空?

时间:2015-02-20 10:43:35

标签: php symfony doctrine-orm dql

我想从Doctrine和Symfony的数据库中选择用户。根据我是否有提供的用户ID列表,我只想选择具有这些ID的用户。如果列表为空,则应选择所有用户。

这是我到目前为止创建的代码:

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) = 0COUNT(:users) = 0,但所有这些都给了我错误。这里的语法是什么?

2 个答案:

答案 0 :(得分: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-ish语法。

答案 1 :(得分:-1)

到目前为止,我提出的唯一解决方案是计算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中不可能直接这样做。