Учение: как манипулировать коллекцией? - PullRequest
1 голос
/ 09 января 2011

С помощью symfony && doctrine 1.2 в действии я пытаюсь отобразить веб-сайт с самым высоким рейтингом для пользователя.

Я сделал:

 public function executeShow(sfWebRequest $request)
  {
    $this->user = $this->getRoute()->getObject();
    $this->websites = $this->user->Websites; 
  }

Единственная проблема заключается в том, что он возвращаетСборник доктрин со всеми веб-сайтами в нем, а не только с топ-рейтингом.

Я уже настроил метод (getTopRanked()), но если я это сделаю:

$this->user->Websites->getTopRanked()

Сбой.

Если у кого-то есть идея изменить коллекцию Doctrine, чтобы отфильтровать только самые ранжированные.

Спасибо

PS: мой метод выглядит так (в websiteTable.class.php):

   public function getTopRanked()
{
  $q = Doctrine_Query::create()
       ->from('Website')
      ->orderBy('nb_votes DESC')
       ->limit(5);
  return $q->execute();

}

Ответы [ 4 ]

5 голосов
/ 09 января 2011

Я бы лучше передал Doctrine_Query между методами:

//action
public function executeShow(sfWebRequest $request)   
{
   $this->user = $this->getRoute()->getObject();
   $this->websites = $this->getUser()->getWebsites(true);  
}

//user
  public function getWebsites($top_ranked = false)
  {
    $q = Doctrine_Query::create()
     ->from('Website w')
     ->where('w.user_id = ?', $this->getId());
    if ($top_ranked)
    {
      $q = Doctrine::getTable('Website')->addTopRankedQuery($q);
    }
    return $q->execute();
  }

//WebsiteTable
public function addTopRankedQuery(Doctrine_Query $q)
{
  $alias = $q->getRootAlias();
  $q->orderBy($alias'.nb_votes DESC')
    ->limit(5)
  return $q
}
1 голос
/ 09 января 2011

В вашем случае $ this-> user-> Websites содержит ВСЕ пользовательские сайты.Насколько я знаю, нет способа отфильтровать существующую коллекцию доктрин (если вы не будете проходить по ней и выбирать интересные элементы).

Я бы просто реализовал метод getTopRankedWebsites () в классе User:

class User extends BaseUser
{
  public function getTopRankedWebsites()
  {
    WebsiteTable::getTopRankedByUserId($this->getId());
  }
}

И добавьте соответствующий запрос в WebsiteTable:

class WebsiteTable extends Doctrine_Table
{
  public function getTopRankedByUserId($userId)
  {
    return Doctrine_Query::create()
     ->from('Website w')
     ->where('w.user_id = ?', array($userId))
     ->orderBy('w.nb_votes DESC')
     ->limit(5)
     ->execute();
  }
}
1 голос
/ 09 января 2011

Если getTopRanked () является методом в вашей пользовательской модели, вы получите к нему доступ с помощью $this->user->getTopRanked()

0 голосов
/ 30 марта 2011

Вы также можете использовать функцию getFirst()

$this->user->Websites->getTopRanked()->getFirst()

http://www.doctrine -project.org / API / ОРМ / 1.2 / учение / doctrine_collection.html # GetFirst ()

...