我有一对多的关系,其中一个页面有很多版本。
**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()。
答案 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作为您尝试查找已发布版本的页面。