CakePHP 4 -对于表A中的2个外键,从表B中获取相应的数据

zpgglvta  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(161)

使用CakePHP 4.1.6
在我的数据库中有两个表,分别叫做CategoriesCategoryChangesCategories表很简单,因为它包含一个带有几个类别的ID和名称的列表,例如:

id | name
------------
1  | Foo
------------
2  | Bar
------------
3  | Baz
------------

我的另一个表CategoryChanges是一个日志,记录了应用程序中的类别(如Categories)何时被更改,以及其他一些数据,如更改者和更改时间。
CategoryChanges中,有两列category_id_fromcategory_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_fromcategory_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
--------------------------------------------------------------------

在阅读了Query Builder文档后,我不知道如何做到这一点。
我的假设是,我需要从CategoryChanges表中读取数据,这很简单:

// in a Controller method
$CategoryChanges = $this->getTableLocator->get('CategoryChanges');
$query = $CategoryChanges->find();

如果我执行$query->toArray(),我将得到上面的第二个表,其中包含category_id_fromcategory_id_to的数字ID。
我假设$query需要额外的条件--或者可能是虚拟字段--用于“category from”和“category to”。我不知道如何将这两个列连接到Categories,以便可以按照表3得到Categories.name

wsewodh2

wsewodh21#

例如,您可以简单地将这些字段的两个belongsTo关联添加到CategoryChanges表中,然后轻松地将innerJoinWith()用于您的查询,如下所示:
第一个

相关问题