2017-09-13 74 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只需要正確的數據提取方式,那麼你的答案絕對是正確的。 –