Как кэшировать агрегированные значения столбцов в экземпляре Doctrine_Record? - PullRequest
1 голос
/ 31 мая 2011

Допустим, у меня есть класс записей, который часто запрашивают с помощью двуязычных столбцов, которые являются агрегатными значениями MySQL:

$results = Doctrine_Core::getTable('MyRecord')->creatQuery('m')
  ->select('m.*, AVG(m.rating) as avg_rating, SUM(m.id) as nb_related') 
  ->innerJoin('m.AnotherRecords a')
  ->where('m.id = ?')
  ->fetchOne();

Теперь давайте скажем, что я хочу, чтобы метод этой записи проверял, существуют ли столбцы агрегатов изкогда запрашивается запись, а если нет, то я хочу выполнить отдельный запрос, чтобы получить следующие значения:

// this doesnt actually work because of filterSet and filterGet
// but its general idea
public function getAverageRating($wtihNbRelated = false)
{
  if(!isset($this->avg_rating) || ($withNbRelated && !isset($this->nb_related))
  {
     $rating = $this->getTable()->getAverageRating($this, $withNbRelated);
     $this->avg_rating = $rating['avg_rating'];

     if($withNbRealted)
     {
       $this->nb_related = $rating['nb_related'];
     }
  }

  return $withNbRelated
    ? array('avg_rating' => $this->avg_rating, 'nb_related' => $this->nb_related)
    : array('avg_rating' => $this->avg_rating);
}

Есть ли простой способ (т. е. не создавать собственный гидратор), чтобы сделатьэто?

1 Ответ

0 голосов
/ 31 мая 2011

Простой ответ на самом деле. Я забыл, что Doctrine ставит перед всеми защищенными членами префикса _. Итак, хотя я изначально пытался манипулировать элементом data, я забыл префикс, который дал мне тот же результат, как если бы я попытался $this->avg_rating или метод его доступа. Решение было:

public function getAverageRating($wtihNbRelated = false)
{
  if(!isset($this->_data['avg_rating']) || ($withNbRelated && !isset($this->_data['nb_related']))
  {
     $rating = $this->getTable()->getAverageRating($this, $withNbRelated);
     $this->_data['avg_rating'] = $rating['avg_rating'];

     if($withNbRealted)
     {
       $this->_data['nb_related'] = $rating['nb_related'];
     }
  }

  return $withNbRelated
    ? array('avg_rating' => $this->_data['avg_rating'], 'nb_related' => $this->_data['nb_related'])
    : array('avg_rating' => $this->_data['avg_rating']);
}
...