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

问题描述

使用 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

解决方法

例如,您可以简单地将这些字段的两个 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');

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...