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;

}

所以我可以获得每个页面的所有页面版本。但是,每个页面都只会有一个已发布的页面版本。因此,在查询时如何获取最新版本?即 Where published = '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 属性,例如标题、发布、日期等。

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

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

返回的错误是致命错误:调用未定义的方法 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 个,您甚至可以使用 getOneOrNullResult() 而不是 getResult()。如果没有匹配的实体,则返回 null,如果有一个匹配则返回实体,如果有多个则返回异常。

编辑:好的,所以你必须在 PageVersion 而不是 page 上构建查询。尝试:

 $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 回答