php - CakePHP 4 - 对于表 A 中的 2 个外键,从表 B 中获取对应数据
问题描述
使用 CakePHP 4.1.6
我的数据库中有两个名为Categories
and的表CategoryChanges
。该Categories
表很简单,因为它包含一个包含多个类别的 ID 和名称的列表,例如
id | name
------------
1 | Foo
------------
2 | Bar
------------
3 | Baz
------------
我的另一个表CategoryChanges
是应用程序中的类别(如Categories
)何时更改的日志,以及其他一些数据,例如谁更改了它们以及何时更改。
其中CategoryChanges
有两列category_id_from
,category_id_to
它们对应于Categories.id
。
例如,CategoryChanges
可能包括以下内容:
id | category_id_from | category_id_to | created | user | notes
--------------------------------------------------------------------
80 | 2 | 3 | 2021-02-03 | John | abcdef
--------------------------------------------------------------------
81 | 3 | 3 | 2021-03-15 | Jack | ghi
--------------------------------------------------------------------
82 | 1 | 2 | 2021-03-18 | Dave | zzz
--------------------------------------------------------------------
我想要做的是在网页上输出一个表格,显示上述信息,但我不想将category_id_from
andcategory_id_to
作为数字 ID,而是希望Categories.name
出现。请注意,对于某些行,“from”和“to”值也可能相同(例如,请参阅 参考资料CategoryChanges.id = 81
)。
所以我想要的输出是这样的:
id | category_from | category_to | created | user | notes
--------------------------------------------------------------------
80 | Bar | Baz | 2021-02-03 | John | abcdef
--------------------------------------------------------------------
81 | Baz | Baz | 2021-03-15 | Jack | ghi
--------------------------------------------------------------------
82 | Foo | Bar | 2021-03-18 | Dave | zzz
--------------------------------------------------------------------
阅读查询生成器文档后,我看不到如何执行此操作。
我的假设是我需要从CategoryChanges
简单的表格中读取:
// in a Controller method
$CategoryChanges = $this->getTableLocator->get('CategoryChanges');
$query = $CategoryChanges->find();
如果我执行$query->toArray()
,我会得到上面的第二个表,其中包含 和 的数字category_id_from
ID category_id_to
。
我认为$query
“类别来自”和“类别至”需要额外的条件 - 或者可能是虚拟字段。我看不到如何将这两列连接起来Categories
,以便Categories.name
按照表 3 获得。
解决方案
belongsTo
例如,您可以简单地将这些字段的两个关联添加到您的CategoryChanges
表中,然后轻松地innerJoinWith()
与您的查询一起使用,例如:
$this
->belongsTo('CategoryFrom')
->setClassName('Categories')
->setForeignKey('category_id_from');
$this
->belongsTo('CategoryTo')
->setClassName('Categories')
->setForeignKey('category_id_to');
$query = $CategoryChanges
->find()
->select([
'id',
'category_from' => 'CategoryFrom.name',
'category_to' => 'CategoryTo.name',
'created',
'user',
'notes',
])
->innerJoinWith('CategoryFrom')
->innerJoinWith('CategoryTo');
推荐阅读
- laravel-5 - 无法让 laravel 与 aws 应用程序负载均衡器一起工作
- react-native - 在本机反应中,borderRadius 无法使用 Image uri 标签
- windows - 该值被发送到系统调用函数,与有效的系统调用代码不匹配
- mysql - 如何修复未删除的触发器
- google-translate - 谷歌翻译已停止在 Chrome 中工作
- c# - 未定义或导入预定义类型“System.String”
- java - 外部化 Spring Boot 配置
- python-3.x - 滚动时间序列
- php - 使用 PHP 在 WordPress 中显示 icecast 元数据(标题)
- reactjs - 我是否错误地安装了 create-react-app?