在 cakephp3 的视图中列出每个类别的文章
Posted
技术标签:
【中文标题】在 cakephp3 的视图中列出每个类别的文章【英文标题】:list articles for each category in a view in cakephp3 【发布时间】:2019-11-06 17:24:56 【问题描述】:我有两张桌子Category
和Articles
。我想在 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 标准将在此处使用 Categories
和 Articles
作为表名;你有没有理由不遵循这个?这样做总体上会让您的生活更轻松。
您的索引将是这样的:
foreach($categories as $category)
h($category->reference);
foreach ($category->article as $article)
h($article->title);
【讨论】:
非常感谢 Greg Schmidt。现在可以正常使用了以上是关于在 cakephp3 的视图中列出每个类别的文章的主要内容,如果未能解决你的问题,请参考以下文章
如何使用部分视图列出无限数量的嵌套类别和子类别。(.NET CORE 5.0)