【发布时间】:2014-06-05 09:54:58
【问题描述】:
我有一个由多个containers 组成的page 实体。在这些容器中,用户可以链接news list。那些news lists 又包含news items。
现在,我想搜索news items,但我需要page,news list 也已链接。
我试过了:
$query = $this->getEntityManager()->createQuery('
SELECT p, c, n, i
FROM VendorNameBundle:Page p
LEFT JOIN p.container c
LEFT JOIN c.news n
LEFT JOIN n.items i
WHERE i.title LIKE :title
GROUP BY i.id
');
这基本上可以为我提供正确的页面。但是要找到正确的news item,我必须遍历所有containers 和它们的news lists。当然,当我检索到所有项目时,我会得到所有项目,而不仅仅是对搜索很重要的项目。
我怎样才能优雅地解决这个问题?
总结:我需要news items 及其对应的page 实体。如何以简洁优雅的方式解决这个问题?
注意:如果news list 被列在多个页面上,结果中一个page 就足够了,不重要。
编辑
以下是 cmets 中要求的关系:
页面
/**
* @ORM\OneToMany(targetEntity="Container", mappedBy="page", cascade={"remove"})
* @ORM\OrderBy({"position" = "asc"})
*/
protected $containers;
容器
/**
* @ORM\ManyToOne(targetEntity="Page", inversedBy="containers")
* @ORM\JoinColumn(name="Page_id", referencedColumnName="id")
*/
private $page;
/**
* @ORM\ManyToOne(targetEntity="News", inversedBy="containers")
* @ORM\JoinColumn(name="news_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $news;
新闻
/**
* @ORM\OneToMany(targetEntity="Container", mappedBy="news")
*/
protected $containers;
【问题讨论】:
-
你能给我们一个例子,说明你们在 Doctrine 中是如何建立关系的吗?
-
Jasper N. Brouwer 有正确的答案。您必须颠倒选择顺序。这也不仅仅是特定于教义或 symfony,但如果你正在编写一个粗略的 mysql 查询,你应该这样做
-
@broncha 你说这是一个粗略的 MYSQL 查询。您能否举例说明如何以更好的方式解决此问题。
-
@Khez 我已经添加了关系。
-
@Khez 我所说的是,在这些情况下,您会以 Jasper N. Brouwer 的身份进行查询,即使它是粗略的 mysql 查询而不是 DQL。您正在寻找项目,那么它应该是您的第一个选择,然后选择您的方式到页面。
标签: php mysql symfony doctrine-orm