【问题标题】:How to return an empty Doctrine_Collection?如何返回一个空的 Doctrine_Collection?
【发布时间】:2011-04-05 10:08:32
【问题描述】:

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

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

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

谢谢 =)

编辑:

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

【问题讨论】:

  • 当你已经知道你将一无所获时,为什么还要查询数据库?只需检查 $values,如果它为空 - 根本不要查询。
  • 我不想查询$values是否为空,只返回一个空的Doctrine_Collection

标签: php symfony1 doctrine dql doctrine-collection


【解决方案1】:

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

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()
  ;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 也许是因为这样你的数据库服务器加载了什么都不做的查询?
    • & @nicola :我认为这是一个聪明的方法,但正如 Wallgate 建议的那样,这将是对数据库服务器的不必要查询。
    【解决方案3】:
    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');
    }
    

    【讨论】:

    • $values.length? values 是一个数组而不是一个对象。你也错过了一个半冒号先生月亮:)
    【解决方案4】:

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

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

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

    【讨论】:

    • 对于Doctrine_Collection 角色的精确度是Ty。
    【解决方案5】:

    我个人使用以下技巧:

    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);
    }
    

    即使有点骇人听闻,效果也很好。

    【讨论】:

    • 只要-1 是一个不可能的值,就可以正常工作。我想我会坚持下去的。
    • 我把 -1 因为 WHERE IN 子句经常用在主键上,但如果你不害怕它,你可以将“ChuckNorr1z”设置为不可能的值;)
    • 这样,您仍然需要(不必要的)往返数据库。
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多