3

我有一个返回 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

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

谢谢 =)

编辑:

添加一个不可能的子句,like->where('1=0')可以解决问题,但它是对数据库服务器的不必要请求。有人有更好的主意吗?

4

5 回答 5

4

那么(您还需要执行方法来获取查询结果!返回类型每次都相同):

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()
  ;
}
于 2011-04-05T12:58:17.333 回答
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');
}
于 2011-04-05T10:17:52.060 回答
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);
}

即使有些骇人听闻,也能很好地工作。

于 2011-04-05T12:47:47.960 回答
1

按价值,我假设你的意思是$values对的?只需添加一些东西来检查值是否为空,然后手动提供一个空集合。

if(empty($values)) 
   return Doctine_Query::create()->from('Anomaly a')->where('1=0');
于 2011-04-05T10:15:31.670 回答
1

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

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

所以,对你来说,最好也返回 FALSE。或者可能是一个空数组。作为 Doctrine_Collection 的两个数组都可以在foreach循环和count函数中使用。如果你想使用deleteandadd函数,你可以调用构造函数。

于 2011-04-05T12:31:46.280 回答