我想从 Twig 中获取 PDO 数据库中多个对象的数据

I want to fetch data from twig for more than one object from the database in PDO

这是我从数据库中获取数据的方法代码。我将这些数据作为对象传递给 html 文件。

     * Get news details
     * 
     * @return object
     */
    public static function getNews()
    {
        $sql = 'SELECT * FROM news 
                ORDER BY date DESC';

        $db = static::getDB();
        $stmt = $db->prepare($sql);

        $stmt->setFetchMode(PDO::FETCH_CLASS, get_called_class());

        $stmt->execute();

        $news = $stmt->fetch();

        return $news;
    }

现在,这是我的索引页渲染函数。getNews()News 的方法 class:

     * Show the index page
     *
     * @return void
     */
    public function indexAction()
    {
        $news = new News();
        $news = $news::getNews();

        View::renderTemplate('Home/index.html', [
            'news' => $news
        ]); 
    }

获得新闻对象后..我想根据降序时间戳添加帖子。我遇到的问题是 $news 没有获取整个 table 的数据。它只显示最新对象的数据。

    <div class="row">

                {% for eachnews in news %}

                    <div class="col-4 mt-4">
                        <div class="card" style="width: 18rem;">
                            <img src="/uploads/news/{{ eachnews.fullfilename }}" class="card-img-top" alt="...">
                            <div class="card-body">
                                <h5 class="card-title">{{ eachnews.title }}</h5>
                                <p class="card-text">{{ eachnews.description }}</p>
                                <a href="news" class="btn btn-primary">Read More</a>
                            </div>
                        </div>
                    </div>

                {% endfor %}

            </div>

非常感谢每一个建议和回答。如果我的问题不清楚,请问我。

您正在使用PDO::fetch(),其中只有returns条记录。您需要使用 PDO::fetchAll() 来获取...所有记录。

    public static function getNews()
    {
        $sql = 'SELECT * FROM news 
                ORDER BY date DESC';

        $db = static::getDB();
        $stmt = $db->prepare($sql);

        $stmt->setFetchMode(PDO::FETCH_CLASS, get_called_class());

        $stmt->execute();

        $news = $stmt->fetchAll();

        return $news;
    }

参见 PDO::fetch() and PDO::fetchAll() 文档页。

顺便说一句,在这种非常特殊的情况下,您不需要准备声明,因为:

  • 你不会多次使用它
  • 你没有注入用户数据

因此,您可以简单地使用 PDO::query():

    public static function getNews()
    {
        $sql = 'SELECT * FROM news 
                ORDER BY date DESC';

        $db = static::getDB();

        return $db->query($sql, PDO::FETCH_CLASS, get_called_class());
    }

如果您需要注入用户输入(用户可能修改的输入,例如 URL 参数、表单输入等),请不要使用此方法。此外,当您需要多次执行查询(例如使用不同的参数)时,准备好的语句具有更好的性能。