CakePHP3表关联设置及分类展示作品问题求助
解决CakePHP3中分类与作品表的关联展示问题
嘿,你这里的关联关系明显搞反啦!咱们先理清楚两张表的逻辑:一个分类下面有多个作品,所以Category和Portfolio是一对多的关系——Category(分类)拥有多个Portfolio(作品),而Portfolio属于一个Category。你现在在Categories模型里用了belongsTo,这是弄反方向了,所以才查不到正确的关联数据。
1. 修正模型关联设置
在CategoriesTable.php中设置关联
找到你的CategoriesTable的initialize方法,把错误的belongsTo改成hasMany,因为分类是“拥有”多个作品:
public function initialize(array $config) { parent::initialize($config); $this->setTable('category'); $this->setDisplayField('name'); $this->setPrimaryKey('id'); // 正确的关联:分类拥有多个作品 $this->hasMany('Portfolios', [ 'foreignKey' => 'category_id', // 对应portfolio表中的category_id字段 'dependent' => true, // 可选:删除分类时自动删除关联作品,根据需求选择 ]); }
(可选但推荐)在PortfoliosTable.php中补充反向关联
为了让关联更完整,在PortfoliosTable的initialize方法里添加belongsTo关联,明确作品属于某个分类:
public function initialize(array $config) { parent::initialize($config); $this->setTable('portfolio'); $this->setDisplayField('name'); $this->setPrimaryKey('id'); // 作品属于一个分类 $this->belongsTo('Categories', [ 'foreignKey' => 'category_id', 'joinType' => 'INNER', ]); }
2. 调整查询代码
你的查询逻辑基本没问题,现在关联修正后,这段代码就能正确获取每个分类及其关联的作品了:
$portfolios_category = $this->Categories->find() ->contain(['Portfolios']) // 现在能正确加载每个分类下的作品了 ->where(['Categories.published' => 1]) ->order(['Categories.created' => 'desc']) ->all();
3. 在视图中按需求展示数据
拿到查询结果后,在视图文件(比如.ctp文件)里用循环输出你要的格式:
<?php foreach ($portfolios_category as $category): ?> <p>分类:<?= h($category->name) ?></p> <?php $index = 1; ?> <?php foreach ($category->portfolios as $portfolio): ?> <p>* 作品<?= $index ?>:<?= h($portfolio->name) ?></p> <?php $index++; ?> <?php endforeach; ?> <?php endforeach; ?>
这样就能输出你想要的效果:
分类:汽车
- 作品1:宝马
- 作品2:奥迪
- 作品3:福特
内容的提问来源于stack exchange,提问作者Frost BYTE
相关产品推荐
相关产品推荐

