如何返回一个空的Doctrine_Collection?

时间:2011-04-05 10:08:33

标签: php symfony1 doctrine dql doctrine-collection

我有一个返回Doctrine_Collection的方法,带有whereIn()子句:

public function getByValues($values)
{
  if (!is_array($values))
    throw new sfException('Wrong parameter type. Excepted array.');

  return Doctrine_Query::create()
    ->from('Anomaly a')
    ->whereIn('a.value', $values);
}

但是,当$values为空数组时,此方法返回 AnomalyTable 中的所有行。这不是一个意外的行为,如Doctrine文档中所述,并写在此处:Doctrine where in with Doctrine_Query

但是,当Doctrine_Collection为空数组时,我想返回空$values而不是查询结果。

关于我如何做到这一点的任何想法?

谢谢=)

编辑:

添加一个不可能的子句,如->where('1=0'),可以解决这个问题,但这对DB服务器来说是一个不必要的请求。有没有人有更好的主意?

5 个答案:

答案 0 :(得分:4)

那么(你还需要execute方法来获取查询结果!返回类型每次都是相同的):

public function getByValues($values)
{
  if (!is_array($values))
    throw new sfException('Wrong parameter type. Excepted array.');

  if (empty($values)) {
    return new Doctrine_Collection('Anomaly');
  }

  return Doctrine_Query::create()
    ->from('Anomaly a')
    ->whereIn('a.value', $values)
    ->execute()
  ;
}

答案 1 :(得分:1)

按价值计算,我认为你的意思是$values对吗?只需添加一些内容来检查值是否为空,然后手动提供空集合。

if(empty($values)) 
   return Doctine_Query::create()->from('Anomaly a')->where('1=0');

答案 2 :(得分:1)

if(count($values)){
  return Doctrine_Query::create()
    ->from('Anomaly a')
    ->whereIn('a.value', $values);
} else {
  return Doctine_Query::create()
    ->from('Anomaly a')
    ->where('0=1');
}

答案 3 :(得分:1)

我认为这样做是不可能的。 Doctrine_Collection不仅仅是一个结果集/对象数组。它还具有删除和添加对象以及保持该状态的方法。

这可能也是许多原生Doctrine函数在没有找到结果时返回FALSE的原因。 (例如,NestedSet函数)。

所以,对你而言,最好还是返回FALSE。或者可能是一个空数组。作为Doctrine_Collection的两个数组都可以在foreach循环和count函数中使用。 如果您想使用deleteadd函数,只需调用构造函数即可。

答案 4 :(得分:1)

我个人使用以下技巧:

public function getByValues($values)
{
  if (!is_array($values))
    throw new sfException('Wrong parameter type. Excepted array.');

  $values = empty($values) ? array(-1) : $values;

  return Doctrine_Query::create()
    ->from('Anomaly a')
    ->whereIn('a.value', $values);
}

即使有点hackish也很好。