php - CakePHP 2.X - 关于 HasMany 关系的几个问题
问题描述
我在使用这个我必须管理的旧框架时遇到了一些问题。
我有这些表:
- 组 -> 有很多 -> 监控
- 监视器 -> 有很多 -> [事件,区域]
- 监视器 -> HAS_AND_BELONGS_TO_MANY -> 组
对于 GROUP -> MONITOR 关系,Cake 创建了一个名为 GROUP_MONITOR 的连接表。
这是组模型上的 HasMany 配置:
'Monitor' => array(
'className' => 'Monitor',
'joinTable' => 'Groups_Monitors',
'foreignKey' => 'GroupId',
'associationForeignKey' => 'MonitorId',
问题 1:
我正在尝试使用所有相关监视器检索所有组。我找到了允许深入关系的递归键:
$all_groups = $this->Group->find('all', array('recursive' => 1));
我收到了这个错误:
未找到列:1054 未知列“字段列表”中的“Monitor.GroupId””
似乎 Cake 没有使用“Groups_Monitors”表,而是在 Monitor 表中搜索 groupId;
问题2:
试图让组查询监视器,递归到 1 我正确地得到了所有组,但也得到了所有其他监视器的 HasMany 关系。
$all_monitors = $this->Monitor->find('all',array("recursive" => 1));
是否可以在 find 中排除一些 HasMany 关系以减少数据量?
解决方案
你说你有
GROUP -> HAS MANY -> MONITOR
“有很多”不使用连接表。这种关系的工作方式是“监视器”必须有一个引用组的外键。如果你想使用连接表,你应该使用“has and belongs to many”。
对于 Q2,使用可包含行为。您将能够详细指定要从数据库中获取的数据和模型。https://book.cakephp.org/2/en/core-libraries/behaviors/containable.html
推荐阅读
- html - 将 svg 加载器添加到 html5 画布
- javascript - Why are csrf token's usually stored in hidden form fields?
- java - 为什么 cellInfo 的大小为零?当我用 TelephonyManager 得到它时它为零
- java - 无法在 java 8 中导入 java.util.stream
- webview - 在 webview 内部和外部打开
- r - 通过正则表达式解决缩短符号
- r - 有没有办法重新格式化以下文本文件的结构
- reactjs - ReactJs:按今天,本周,当年分组数据
- apache-flink - 如果算子的并行实例总数高于 Flink 应用程序的并行度会怎样?
- php - 带有哈希值的 url id 掩码:未配置连接 [App\User]