gpt4 book ai didi

php - 仅选择页面上链接的相关新闻项(多一二多关系)

转载 作者:可可西里 更新时间:2023-11-01 07:18:05 24 4
gpt4 key购买 nike

我有一个 page 实体,它由多个 container 组成。在这些容器中,用户可以链接一个新闻列表。这些新闻列表再次包含新闻项目

现在,我想搜索 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,我必须遍历所有 container 及其 news list。当然,当我检索所有项目时,我会得到所有项目,而不仅仅是对搜索重要的项目。

我怎样才能优雅地解决这个问题?

总结:我需要 news items 及其对应的 page 实体。我怎样才能以简洁优雅的方式解决这个问题?

注意:如果新闻列表在多个页面上列出,结果中的一个页面就足够了,哪个并不重要。

编辑

以下是评论中要求的关系:

页面

/**
* @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;

最佳答案

查询

因为您正在搜索新闻条目,所以我建议您从这些新闻条目一直搜索到页面(而不是相反):

SELECT i, n, c, p
FROM VendorNameBundle:Item i
JOIN i.news n
JOIN n.container c
JOIN c.page p
WHERE i.title LIKE :title

此查询假定每个 新闻项都在一个新闻列表中,每个 新闻列表都在一个容器中,每个 容器都在其中页面。如果这不是真的,请使用 LEFT JOIN 而不是 JOIN,否则您将错过一些新闻条目。

分组

此查询将为您提供所需的数据,但可能未按照您希望的方式进行格式化。如果您想按页面或新闻列表(等)对项目进行分组,则需要手动执行此操作(在代码中)。

但是您可以让查询进行一些排序,这样分组(在代码中)变得更容易。以下示例将首先按页面标题,然后是新闻列表标题对结果进行排序:

SELECT i, n, c, p
FROM VendorNameBundle:Item i
JOIN i.news n
JOIN n.container c
JOIN c.page p
WHERE i.title LIKE :title
ORDER BY p.title ASC, n.title ASC

现在分组可以这样进行:

$currentPage     = null;
$currentNewsList = null;

foreach ($newsItems as $newsItem) {
$newsList = $newsItem->getNews();
$page = $newsList->getContainer()->getPage();

if ($page !== $currentPage) {
$currentPage = $page;
echo '- ' . $page->getTitle() . "\n";
}

if ($newsList !== $currentNewsList) {
$currentNewsList = $newsList;
echo ' - ' . $newsList->getTitle() . "\n";
}

echo ' - ' . $newsItem->getTitle() . "\n";
}

这将打印如下内容:

- Page A
- News list A
- Found news item
- News list C
- Another found news item
- Page B
- News list B
- Yet another found news item

关于php - 仅选择页面上链接的相关新闻项(多一二多关系),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24057022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com