我有一个 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/
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking