首页 > 解决方案 > 是否可以在 CakePHP 3 中使用具有可包含行为的 find('list')?

问题描述

应用程序使用的是 CakePHP 3.5.18 版

我使用 ORM 来获取返回键/值对的列表:

$Displays = TableRegistry::get('Displays');
$displays = $Displays->find('list', ['keyField' => 'id', 'valueField' => 'id'])->where(...)->toArray();

这按预期工作。一个debug($displays);看起来像这样的例子:

(int) 36 => (int) 36,
(int) 160 => (int) 160,
(int) 149 => (int) 149,
...

在这个特定的应用程序中,有 3 个模型在以下层次结构中工作:

该应用程序已经过烘焙,以便在 Table 类中定义适当的关系。

// src/Model/Table/RegulationsTable.php
$this->hasMany('Groups', [
    'foreignKey' => 'regulation_id'
]);

// src/Model/Table/GroupsTable.php
$this->hasMany('Displays', [
    'foreignKey' => 'group_id'
]);

// src/Model/Table/DisplaysTable.php
$this->belongsTo('Groups', [
    'foreignKey' => 'group_id',
    'joinType' => 'INNER'
]);

我想要做的是调整由定义的查询,$displays以便结果对应于给定的Regulations.id. 我正在尝试做的普通 SQL 等效项是... WHERE regulations.id IN (1,2,3)假设 ID 是 1、2 和 3。

当我阅读有关传递条件以包含它的 Cake 文档时说:

当您限制从关联中提取的字段时,您必须确保选择了外键列。未能选择外键字段将导致关联数据不存在于最终结果中。

我不明白这是怎么可能的,find('list')因为那只选择开发人员指定的keyFieldvalueField?在这种情况下,displays.id两者都适用。

无论如何,我不明白如何编写此查询,因为在同一个链接文档中它说

使用时,contain()您可以限制关联返回的数据并按条件过滤它们。要指定条件,请传递一个匿名函数,该函数接收一个查询对象作为第一个参数,\Cake\ORM\Query

contain()实际操作是什么:我认为它是Regulations但不知道如何写这个。

标签: phpcakephpormcakephp-3.0

解决方案


我认为您需要通过匹配而不是通过包含来查看过滤数据。(如果我理解正确的话。)

您可以find('list')结合->matching(...)

$displays = $this->Displays->find('list')
    ->matching('Groups.Regulations', function ($q) use ($ids) {
        return $q->where(['Regulations.id IN' => $ids]);
    })
    ->toArray();

(尚未测试)


推荐阅读