教义oneToMany - 查询一个

时间:2013-02-01 17:18:52

标签: symfony doctrine relationship one-to-many

我有一对多的关系,其中一个页面有很多版本。

**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'而不是获得所有版本的列表?

以下是我的查询示例:

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;
    }
}

但是,如果我遍历结果,我只能访问Page属性,而不能访问PageVersion属性,例如title,published,date等。

  

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

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

返回的错误是致命错误:调用未定义的方法Doctrine \ ORM \ PersistentCollection :: getTitle()。

1 个答案:

答案 0 :(得分:0)

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

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

如果您确定不会有超过1页的已发布状态,您甚至可以使用getOneOrNullResult()而不是getResult()。如果没有匹配的实体,则返回null;如果存在一个匹配,则返回实体;如果存在多个匹配,则返回异常。

编辑:好的,所以你必须在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作为您尝试查找已发布版本的页面。