我想从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) = 0
,COUNT(:users) = 0
,但所有这些都给了我错误。这里的语法是什么?
答案 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中不可能直接这样做。