2017-09-13 101 views
0

我正在尝试创建一个包含多个论坛类别的在线论坛。我与所有的类一个概述,每个类别的名下,我要链接到最新帖子中提到的类别,这样的事情:如何在包含的SQL查询中使用Twig循环值

我的论坛

酷类
最新留言:测试线程通过李四

类有趣
最新留言:另一个测试线由李四

滑稽的类别
最新留言:笑话线程通过李四


所以,我做了一个SQL查询来获取所有论坛类别:

$forumCategories = DB::run('SELECT * FROM forumCategories ORDER BY id ASC')->fetchAll(); 


并把它变成一个全局变量:

$twig->addGlobal('forumCategories', $forumCategories); 


并取得for循环列出所有类别:

{% for category in forumCategories %} 
    <h3>{{category.title}}</h3> 
{% endfor %} 


到目前为止,一切都很好。

但现在,我想显示每个类别中的最新帖子。我想运行一个SQL查询并从表forumPosts中获取最新的帖子,为每个论坛类别,并在循环内显示它。我需要显示来自forumPosts的一行,其中类别与循环中的category.id相同。我该怎么做呢?


数据库的结构和内容:

CREATE TABLE `forumCategories` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `urlTitle` varchar(255) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `forumCategories` (`id`, `title`, `urlTitle`, `description`) 
VALUES 
    (1,'Hovedrommet','hovedrommet','Dette er hovedrommet på Nye Dofo.'), 
    (2,'Forumleker','forumleker','Her kan man leke ulike forumleker.'); 

CREATE TABLE `forumPosts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) NOT NULL, 
    `urlTitle` varchar(255) NOT NULL, 
    `category` int(11) NOT NULL, 
    `content` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `forumPosts` (`id`, `title`, `urlTitle`, `category`, `content`) 
VALUES 
    (1,'Test','test',1,'Dette er test1.'), 
    (2,'Test2','test2',1,'Dette er test2.'), 
    (3,'Test3','test3',2,'Dette er test3.'), 
    (4,'Test4','test4',2,'Dette er test4.'); 

我想输出是所有类别的“称号”,以及最新帖子(具有最高的ID)的“称号”的循环每个类别。我设法得到类别名称,但不是最新的帖子。

我想下面的输出:

Hovedrommet
最新留言:Test2的

Forumleker
最新留言:TEST4

+0

这将有助于看到表结构,一些样本数据,以及您所期望的输出。 –

+0

@TimBiegeleisen我已经更新了原来的问题 – Galaniitoluodda

+0

哪一列可以用来找到最新的帖子? –

回答

0

我觉得你的问题是一个相当常规的查询。只需将两个表加在一起也可以加入到为每个类别查找最新帖子的子查询中。

SELECT 
    fc.title, 
    fp1.title 
FROM forumPosts fp1 
INNER JOIN 
(
    SELECT category, MAX(id) AS max_id 
    FROM forumPosts 
    GROUP BY category 
) fp2 
    ON fp1.category = fp2.category AND 
     fp1.id = fp2.max_id 
INNER JOIN forumCategories fc 
    ON fp1.category = fc.id 

输出:

 title title 
1 Hovedrommet Test2 
2 Forumleker Test4 

演示在这里:

Rextester

+0

非常感谢您提供了一个不错的解决方案! :) – Galaniitoluodda

0

一般不包括在您的模板,因为查询的最佳实践目标应该是尽可能分离模型和视图。

我将使用控制器来收集视图的数据并以视图可以消化并直接将其传递给视图而不使用全局的方式对其进行组织。

编辑以备将来参考

例如,你可以使用由Tim Biegeleisen或类似提供的查询来收集数据:

SELECT p.id, p.title, p.urlTitle, c.title 
FROM (select * from forumPosts order by category, id DESC) p 
JOIN forumCategories c ON c.id = p.category 
GROUP BY p.category 

http://sqlfiddle.com/#!9/e0d35/28

,并将结果保存到您的变量:

$forumCategories = DB::run($query)->fetchAll(); 

然后哟ü可以通过整个事情的模板,是这样的:

$this->render('template.twig', array('forumCategories' => $categories)); 

然后访问它的模板,你可以这样做以下:

{% for category in forumCategories %} 
    <h3>{{category.categoryTitle}}</h3> 
    <h4><a href="path/to/article/{{ category.urlTitle }}">{{ category.title }}</a></h4> 
{% endfor %} 
+0

谢谢!我更喜欢你的解决方案,因为你的查询更短,更简单 - 只有一个问题,它显示最旧的帖子,而不是最新的帖子。它需要显示ID值最高的那个。尽管您已设法在“ID”列中输出正确的ID,但帖子信息是关于ID值最低的帖子。什么会解决这个问题? – Galaniitoluodda

+0

@Tim,是的,你是绝对正确的,我是一个有点骑士与我的查询,这是不正确的。我的主要观点是工作应该在控制器中完成,而不是在视图中完成。如果OP只需要正确的数据提取方式,那么你的答案绝对是正确的。 –