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

私がそれをどのように行うことができるかについてのアイデアはありますか?

ありがとう=)

編集:

トリックを行うように、不可能な句を追加し->where('1=0')ますが、これはDBサーバーへの不要な要求です。誰かがより良いアイデアを持っていますか?

4

5 に答える 5

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()
  ;
}
于 2011-04-05T12:58:17.333 に答える
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
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

それは不可能だと思います。Doctrine_Collectionは、オブジェクトの結果セット/配列以上のものです。また、オブジェクトを削除および追加し、その状態を維持する手段もあります。

これFALSEが、結果が見つからなかったときに多くのネイティブDoctrine関数が返される理由でもあります。(たとえば、NestedSet関数)。

したがって、あなたにとっては、おそらくFALSEも返すのが最善です。または多分空の配列。foreachDoctrine_Collectionとしての両方の配列は、ループとcount関数で使用できます。deleteand関数を使用する場合はadd、コンストラクターを呼び出すだけです。

于 2011-04-05T12:31:46.280 に答える