2

クラステーブル継承を作成する抽象クラスを共有する2つのエンティティがあります。抽象クラスのリポジトリを使用してエンティティをクエリし、結果として抽象クラスを拡張するすべてのエンティティを取得できます。

$qb = $this->createQueryBuilder('c')
    ->where('c.featured = true')
    ->orderBy('c.sticky', 'DESC')
    ->addOrderBy('c.weight', 'ASC')
    ->setFirstResult($offset)
    ->setMaxResults($limit);

// Returns 8 results, results in 34 queries

サブクラスには他のエンティティとのManyToMany関係が含まれているため、この方法でクエリを実行すると、それらの関係は結合されていないため、追加のクエリが発生します。抽象クラスを拡張し、それらの列を結合するエンティティをどのように照会できますか?左結合を使用して複数のfromステートメントを追加しようとしましたが、クエリが返す結果は予想よりも少なくなりました。そのクエリビルダーは次のようになります。

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select(array(
    'a', 'artist', 'country', 
    't', 'artwork', 'user'))
   ->from('AcmeArtworkBundle:Artwork', 'a')
   ->from('AcmeTourBundle:Tour', 't')
   ->leftJoin('a.artist', 'artist')
   ->leftJoin('a.country', 'country')
   ->leftJoin('t.artwork', 'artwork')
   ->leftJoin('t.user', 'user')
   ->where('a.featured = true')
   ->andWhere('t.featured = true')
   ->orderBy('a.sticky', 'DESC')
   ->addOrderBy('t.sticky', 'DESC')
   ->addOrderBy('a.weight', 'ASC')
   ->addOrderBy('t.weight', 'ASC')
   ->setFirstResult($offset)
   ->setMaxResults($limit);

// 5 results :-(
4

2 に答える 2

0

@Ocramiusによって提供されるリンクによって提供される情報から、デフォルトではDoctrineは遅延読み込みを使用してエンティティを読み込みます。アソシエーションは、必要な場合にのみフェッチされます。フェッチモードをEAGERに設定することで、Doctrineに関連付けを自動的にフェッチするように指示できます。

/**
 * @var string $date
 *
 * @ORM\ManyToOne(targetEntity="Date", inversedBy="artwork", cascade={"persist"}, fetch="EAGER")
 * @ORM\JoinColumn(name="date", referencedColumnName="id")
 */
private $date;

注意しないと、これを行うことで実際により多くのクエリを実行できることに注意することが重要です。

于 2012-12-04T20:20:44.923 に答える
0

ドキュメントで説明されているように、フェッチ結合とDoctrineORMのPaginatorを使用できます。

$qb = $em->createQueryBuilder()
    ->select('c', 'd')
    ->from('MyInheritanceClass', 'c')
    ->join('c.d', 'd')
    ->where('c.featured = true')
    ->orderBy('c.sticky', 'DESC')
    ->addOrderBy('c.weight', 'ASC')
    ->setFirstResult($offset)
    ->setMaxResults($limit);

$paginator = new \Doctrine\ORM\Tools\Pagination($qb);

var_dump(count($paginator)); // 8 results, 2 queries
于 2012-12-01T03:19:00.950 に答える