【问题标题】:CakePHP 2.X - Couple of questions on HasMany RelationCakePHP 2.X - 关于 HasMany 关系的几个问题
【发布时间】:2020-03-25 11:07:21
【问题描述】:

我在使用这个我必须管理的旧框架时遇到了一些问题。

我有这些表:

  • 组 -> 有很多 -> 监控器
  • 监视器 -> 有很多 -> [事件,区域]
  • 监视器 -> 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:

试图让 Groups 查询 Monitors,递归到 1 我正确地得到了所有组,但也得到了所有其他 Monitor 的 HasMany 关系。

$all_monitors = $this->Monitor->find('all',array("recursive" => 1));

是否可以在 find 中排除一些 HasMany 关系以减少数据量?

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    你说你有

    GROUP -> HAS MANY -> MONITOR
    

    “有很多”不使用连接表。这种关系的工作方式是“监视器”必须有一个引用组的外键。如果你想使用连接表,你应该使用“has and belongs to many”。

    对于 Q2,使用可包含的行为。您将能够详细指定要从数据库中获取的数据和模型。 https://book.cakephp.org/2/en/core-libraries/behaviors/containable.html

    【讨论】:

    • 嗨!谢谢你的答案。我仍然对问题 2 有疑问。使用:$this->Monitor->find('all') 我只有 Monitor。 $this->Monitor->find('all', array("recursive" => 0)) 我得到了作为 AsOne 关系的 Monitor 和 MonitorStatus。使用 recusrive => 1 我得到了所有关系(组也是)。我添加了 'contain' => array ("Group") 来获得 ONLY Group 但它仍然给我 ALL
    • 您的意思是您正在查询监视器并希望只获得组?
    • 是的。某种方式来指定哪些连接。但从你的问题来看,我认为是不可能的。
    • 如果你对 Groups 感兴趣,你应该使用 Group 来运行查询,使用 Monitor 只会混淆。
    • 使用组是我尝试做的,但不幸的是,ZoneMinder 的原始程序员,我为其编写插件的软件,选择了 HasMany 关系,我无法修改它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多