在 cakephp3 的视图中列出每个类别的文章

Posted

技术标签:

【中文标题】在 cakephp3 的视图中列出每个类别的文章【英文标题】:list articles for each category in a view in cakephp3 【发布时间】:2019-11-06 17:24:56 【问题描述】:

我有两张桌子CategoryArticles。我想在 cakephp3 的文章index.ctp 中列出每个类别的文章。我在我的控制器中使用了两个查询,一个列出类别,另一个列出每个类别的文章。这是两张表的内容:

|--------------------|----------------------|
|  Category          |  Articles            |
|--------------------|----------------------|
| idCategory         | idArticles           |
| Reference          | Title                |
|                    | Description          |
|                    | Created              |
|                    | Category.idCategory  |
|--------------------|----------------------|

下面是我在articlesController.php中的代码

$category = $this->paginate(TableRegistry::get('Category')->find('all'));
$this->set(compact('category'));

$article = $this->Articles
    ->find('all',array( 'order' => array('Created DESC')))
    ->contain(['Category'])
    ->where(['Category.idCategory' == 'idCategory']);

在我的 index.ctp 模板中,我使用了两个 foreach 循环:

foreach($category as $c) 
    h($c->reference)

    foreach ($article as $a) 
        h($a->title)
    

但是当我显示时,所有文章都出现在第一个类别中,其他类别为空,而文章有不同Category_idCategory。 我的请求有问题吗?

【问题讨论】:

【参考方案1】:

您的查询有误。您有一个包含所有类别的列表,然后是一个包含所有文章的列表。而->where(['Category.idCategory' == 'idCategory']) 使用的是 PHP 比较运算符,所以解析为 ->where([false]),肯定不是你想要的。

您在文章查询中使用了contain,但它实际上应该在类别查询中,然后根本没有文章查询:

$categories = $this->paginate(TableRegistry::get('Category')->find('all')->contain(['Article']);

此外,Cake 标准将在此处使用 CategoriesArticles 作为表名;你有没有理由不遵循这个?这样做总体上会让您的生活更轻松。

您的索引将是这样的:

foreach($categories as $category) 
    h($category->reference);

    foreach ($category->article as $article) 
        h($article->title);
    

【讨论】:

非常感谢 Greg Schmidt。现在可以正常使用了

以上是关于在 cakephp3 的视图中列出每个类别的文章的主要内容,如果未能解决你的问题,请参考以下文章

如何使用部分视图列出无限数量的嵌套类别和子类别。(.NET CORE 5.0)

如何在 Hive SQL 中列出每个类别中的前 10 行

Django:列出页面中每个类别的产品

如何从大字典中列出的每个类别的所有可能的值组合创建数据框

django按类别列出,带有indexview和detailview类

Django列出包含某些相同项目的类别中的项目