2011-01-08 14 views
1

symfonyの場合& & doctrine 1.2のアクションでは、ユーザーのトップランクのWebサイトを表示しようとします。Doctrine:コレクションを操作する方法は?

私がやった:

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

唯一の問題は、それがすべてそれでウェブサイトやトップランクのものではないだけでDoctrineのコレクションを返すことです。

Iすでにセットアップ方法(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(); 

} 
+0

あなたは ')(' getTopRankedをどこに置いたのとどのようにそれが見えますか? – DrColossos

+0

私の編集を見て、私は機能を追加しました。 :-) –

+0

特定のユーザーに属するすべてのWebサイトではなく、すべてのWebサイトの値を読み取ります。あなたがユーザーオブジェクト内から呼び出すとしても、あなたのクエリはユーザーの値を使用しません...私はDoctrineが必要なJOINを独自に追加するとは思いません。 – DrColossos

答えて

5

私はむしろメソッドの間に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 
} 
+0

ありがとうございます。私は教義のコレクションを変更することが可能だと考えました。 –

1

getTopRanked()は、ユーザーモデル内のメソッドである場合、あなたは$this->user->getTopRanked()でそれにアクセスします

+0

さて、フィルタリングする前に別名「ウェブサイト」を持つユーザーのウェブサイトを取得する必要がありますか? –

1

$ this-> user->ウェブサイトには、すべてのユーザーのウェブサイトが含まれています。私が知る限り、既存の教義コレクションをフィルタリングする方法はありません(あなたがそれを反復して興味深い要素を選択しない限り)。

私は単にUserクラスでgetTopRankedWebsites()メソッドを実装したい:

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(); 
    } 
} 
関連する問題