php - 是否可以在 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 个模型在以下层次结构中工作:
- 条例(1级。表名
regulations
)- 组(第 2 级。表名
groups
)- 显示(级别 3。表名称
displays
)
- 显示(级别 3。表名称
- 组(第 2 级。表名
该应用程序已经过烘焙,以便在 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')
因为那只选择开发人员指定的keyField
和valueField
?在这种情况下,displays.id
两者都适用。
无论如何,我不明白如何编写此查询,因为在同一个链接文档中它说
使用时,
contain()
您可以限制关联返回的数据并按条件过滤它们。要指定条件,请传递一个匿名函数,该函数接收一个查询对象作为第一个参数,\Cake\ORM\Query
contain()
实际操作是什么:我认为它是Regulations
但不知道如何写这个。
解决方案
我认为您需要通过匹配而不是通过包含来查看过滤数据。(如果我理解正确的话。)
您可以find('list')
结合->matching(...)
:
$displays = $this->Displays->find('list')
->matching('Groups.Regulations', function ($q) use ($ids) {
return $q->where(['Regulations.id IN' => $ids]);
})
->toArray();
(尚未测试)
推荐阅读
- c++ - 当vector的大小太大时,如何解决C++中内存不足的问题?
- google-cloud-platform - Cloud Run 和 Cloud Scheduler - 在完整数据集上获取失败结果
- c - 在 kthread_run 中通过花括号和多个分号进行宏扭曲
- python - 在 python 中求解代数方程
- python - Mac 上 Python 和 ffmpeg 的权限问题
- c++ - 试图在自己的 .cpp 和 .h 文件中制作 Node
- c++ - Add a variable to a struct at runtime C++
- python - 函数可以返回 Python 中使用的另一个函数
- linux - X (Linux) 上的镜像窗口
- python - 在python中拆分字符串