Как вернуть пустую коллекцию Doctrine_Collection? - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть метод, который возвращает 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, где используется Doctrine_Query

Однако я хотел бы вернуть пустой Doctrine_Collection вместорезультат моего запроса, когда $values является пустым массивом.

Есть идеи, как мне это сделать?

Спасибо =)

Редактировать:

Добавление невозможного предложения, например ->where('1=0'), поможет, но это ненужный запрос к серверу БД.У кого-нибудь есть идея получше?

Ответы [ 5 ]

4 голосов
/ 05 апреля 2011

А как насчет (вам также нужен метод 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 голос
/ 05 апреля 2011

Я лично использую следующую уловку:

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 голос
/ 05 апреля 2011
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');
}
1 голос
/ 05 апреля 2011

Я думаю, что это невозможно сделать.Коллекция Doctrine_Collection - это больше, чем набор результатов / массив объектов.Он также имеет средства для удаления и добавления объектов и сохранения этого состояния.

Возможно, поэтому многие нативные функции Doctrine возвращают FALSE, когда результаты не найдены.(Например, функции NestedSet).

Итак, для вас, вероятно, также лучше вернуть FALSE.или, может быть, пустой массив.Оба массива как Doctrine_Collection могут использоваться в цикле foreach и функции count.Если вы хотите использовать функции delete и add, вы можете просто вызвать конструктор.

1 голос
/ 05 апреля 2011

По значению, я полагаю, вы имеете в виду $values верно?просто добавьте что-нибудь, чтобы проверить, являются ли значения пустыми, а затем вручную введите пустую коллекцию.

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