【问题标题】:CakePHP 4 - for 2 foreign keys in Table A, get corresponding data from Table BCakePHP 4 - 对于表 A 中的 2 个外键,从表 B 中获取对应数据
【发布时间】:2021-08-24 10:41:44
【问题描述】:

使用 CakePHP 4.1.6

我的数据库中有两个名为CategoriesCategoryChanges 的表。 Categories 表很简单,因为它包含一个包含 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 需要附加条件——或者可能是虚拟字段——用于“类别来自”和“类别至”。我看不到如何将这两列连接到Categories,以便我可以根据表 3 获得Categories.name

【问题讨论】:

    标签: php cakephp cakephp-4.x


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2021-12-16
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多