2012-05-08 22 views
1

私はSymfony2とDoctrine2を使って小さなウェブサイトを構築しています。ブログ投稿、イベント、プレスリリースがあります。これらはそれぞれ非常に似ているので、「ノード」という親テーブルを持つ単一テーブル継承(STI)を使用することに決めました。Doctrine2でクエリ継承のようなものを構築するにはどうすればよいですか?

ノードが持っている:

  • 文字列であると述べている「ロケール」フィールド、ブールある「公表」欄には​​、「これは、このロケールに示すことのみです」。 (ロケールはリクエストによって渡されます)。

デフォルトでは、現在のロケールの公開ノードのみを表示する必要があります。

$this->createQueryBuilder('Event') 
    ->where('Node.published = 1') 
    ->where('Node.locale = :locale') 

が、これは非常に乾燥していないようです:

もちろん、私は次のようになり、リポジトリ内のクエリの多くを作成することができます。

他のクエリが「継承」できるデフォルトのクエリを作成するにはどうすればよいですか?これには、関係に基づいたデフォルトのDoctrineクエリが含まれていなければなりません。

答えて

4

相続はおそらく過剰です。

なぜ、あらかじめ設定されたqueryBuilderを提供するファクトリメソッドを作成するだけではないのですか?

class NodeRepository extends Doctrine\ORM\EntityRepository { 

    public function getLocalizedNodeQueryBuilder($type,$locale){ 
     return $this->getQueryBuilder($type) 
      ->where('Node.published = 1') 
      ->where('Node.locale = :locale') 
      ->setParameter('locale',$locale); 
    } 
} 

あなたは同じことを行うと、あなたは常にあなたのquerybuilderがそのように構成してもよろしいなら単にgetQueryBuilderをオーバーライドすることができます。

2

リポジトリクラスにそのようなものを構築する必要はありません。 "Discriminator Map"を使用して単一テーブルの継承を設定すると、別々のクラス(エンティティ)になります。 DoctrineはDBALと対話するときに、あなたの "ノードタイプ"によるフィルタリングを行います。例えば

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/inheritance-mapping.html#single-table-inheritance

あなたは、むしろそのでそれを表現しようとするよりも、独自のエンティティにあなたの「ブログ投稿」ロジックをカプセル化することができるようになりますよう..

namespace MyProject\Model; 

/** 
* @Entity 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="discr", type="string") 
* @DiscriminatorMap({"node" = "Node", "blogpost" = "Blogpost", "events" = "Events"}) 
*/ 
class Node 
{ 
    // ... 
} 

/** 
* @Entity 
*/ 
class Blogpost extends Node 
{ 
    // ... 
} 

/** 
* @Entity 
*/ 
class Events extends Node 
{ 
    // ... 
} 


// get me all the blogposts 
$blogposts = $em->getRepository('Blogpost')->findAll(); 

// get me all the events 
$events = $em->getRepository('Events')->findAll(); 

、これは特に有益です親クラス "ノード"。

+0

「公開されたノードのみを表示する」のように、他のフィルタを追加するにはどうすればよいですか? –

+0

親「Node」を継承しているため、これらの値は依然として照会に使用できます。したがって、$ em-> getRepository( 'Events') - > findAllBy(array( 'published' => 'yes'));うまくいくはずです。 –

+0

興味深いことに、私は 'デフォルトのプロパティ'配列を持ち、それを 'findAllBy()'に渡すことができます。ノードリポジトリに存在するgetterとsetterを持つことができます。 –

関連する問題