CakePHP 4 - 对于 Table A 中的 2 个外键,从 Table B 中获取相应的数据
CakePHP 4 - for 2 foreign keys in Table A, get corresponding data from Table B
使用 CakePHP 4.1.6
我的数据库中有两个 table,分别是 Categories
和 CategoryChanges
。 Categories
table 很简单,因为它包含一个列表,其中包含多个类别的 ID 和名称,例如
id | name
------------
1 | Foo
------------
2 | Bar
------------
3 | Baz
------------
我的另一个 table、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
--------------------------------------------------------------------
我想要做的是在显示上述信息的网页上输出 table 但我想要的不是 category_id_from
和 category_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
table 中读取,这很简单:
// in a Controller method
$CategoryChanges = $this->getTableLocator->get('CategoryChanges');
$query = $CategoryChanges->find();
如果我执行 $query->toArray()
,我会得到上面的第二个 table,其中包含 category_id_from
和 category_id_to
.
的数字 ID
我假设 $query
需要附加条件 - 或者可能是虚拟字段 - 用于“类别来自”和“类别至”。我看不到如何将这两列连接到 Categories
以便我可以根据 table 获得 Categories.name
3.
例如,您可以简单地将这些字段的两个 belongsTo
关联添加到您的 CategoryChanges
table,然后在您的查询中舒适地使用 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');
使用 CakePHP 4.1.6
我的数据库中有两个 table,分别是 Categories
和 CategoryChanges
。 Categories
table 很简单,因为它包含一个列表,其中包含多个类别的 ID 和名称,例如
id | name
------------
1 | Foo
------------
2 | Bar
------------
3 | Baz
------------
我的另一个 table、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
--------------------------------------------------------------------
我想要做的是在显示上述信息的网页上输出 table 但我想要的不是 category_id_from
和 category_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
table 中读取,这很简单:
// in a Controller method
$CategoryChanges = $this->getTableLocator->get('CategoryChanges');
$query = $CategoryChanges->find();
如果我执行 $query->toArray()
,我会得到上面的第二个 table,其中包含 category_id_from
和 category_id_to
.
我假设 $query
需要附加条件 - 或者可能是虚拟字段 - 用于“类别来自”和“类别至”。我看不到如何将这两列连接到 Categories
以便我可以根据 table 获得 Categories.name
3.
例如,您可以简单地将这些字段的两个 belongsTo
关联添加到您的 CategoryChanges
table,然后在您的查询中舒适地使用 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');