1

1 つのページに多くのバージョンがある 1 対多の関係があります。

**page**

id
parent_id

**page_version**
id
page_id
title
published
date

これらは、外部キー page_id によって関連付けられています。したがって、Page エンティティと PageVersion エンティティがあります。

class Page
{
    /**
    * @ORM\OneToMany(targetEntity="PageVersion", mappedBy="page")
    */
   private $pageversions;
}
class PageVersion
{
    /**
     * @var page
     *
     * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageversions")
     *
     */
    private $page;

}

したがって、各ページのすべてのページ バージョンを取得できます。ただし、各ページには、公開されたページ バージョンが 1 つしかありません。したがって、クエリを実行するときに、最新バージョンを取得するにはどうすればよいですか? つまり、すべてのバージョンのリストを取得するのではなく、公開場所 = '1' ですか?

これが私のクエリの例です:

public function findAllPages()
{
    $query = $this->getEntityManager()
        ->createQuery('
        SELECT DISTINCT p,v
        FROM XYZWebsiteBundle:Page p
        JOIN p.pageversions v
        WHERE v.published = :published
        AND v.deleted = :deleted'
    )->setParameters(array('published' => 1, 'deleted' => 0));

    try {
        return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

ただし、結果をループすると、ページのプロパティにしかアクセスできず、タイトル、公開、日付などの PageVersion プロパティにはアクセスできません。

$entities = $em->getRepository('XYZWebsiteBundle:Page')->findAllPages();

    foreach($entities as $entity){
        print($entity->getPageVersion()->getTitle());
    }

返されるエラーは Fatal error: Call to undefined method Doctrine\ORM\PersistentCollection::getTitle() です。

4

1 に答える 1

0
$er = $this->getDoctrine()->getRepository('XYZWebsiteBundle:Page');
$qb = $er->createQueryBuilder('p')
    ->where('p.published = :published')
                ->setParameter('published', 1)
    ;

$entities=$qb->getQuery()->getResult();

公開ステータスのページが 1 ページしかないことが確実な場合は、getResult() の代わりに getOneOrNullResult() を使用することもできます。これは、一致するエンティティがない場合は null を返し、一致するエンティティが 1 つある場合はエンティティを返し、複数ある場合は例外を返します。

編集:わかりました。そのため、ページではなく PageVersion でクエリを作成する必要があります。試す:

 $er = $this->getDoctrine()->getRepository('XYZWebsiteBundle:PageVersion');
    $qb = $er->createQueryBuilder('p')
        ->where('p.page = :page')
                    ->setParameter('page', $page)
        ->andWhere('p.published = :published')
                    ->setParameter('published', 1)
        ;

    $pageVersion=$qb->getQuery()->getResult();

$page は、公開されたバージョンを見つけようとしているページです。

于 2013-02-02T10:12:17.817 に答える