gpt4 book ai didi

cakephp - 带有 self 的 HABTM 需要连接表中的 2 倍行数?

转载 作者:行者123 更新时间:2023-12-04 18:13:05 24 4
gpt4 key购买 nike

我正在尝试使用 Nodes 构建一个 CMS作为主要型号。每个Node belongsTo一个 NodeType , 以及每个 Node可以与任何/所有其他Node相关.

所以 - 认为这需要HABTM:

//Node model
public $hasAndBelongsToMany = array(
'AssociatedNode' => array(
'className' => 'Node',
'foreignKey' => 'node_id',
'associationForeignKey' => 'associated_node_id',
'joinTable' => 'node_associations'
)
);

问题是,似乎唯一可行的方法是每个关联都有两行。

只有一个关联行的示例:

节点
  • ER (id=1)
  • 乔治克鲁尼 (id=2)

  • 连接表中的一行描述了这两个节点之间的关系:
  • 'node_id' = 1
  • '关联节点id' = 2

  • 现在 - 如果我查询 TV Shows 并包含它的 Actor 节点:
    $nodes = $this->Node->find('all', array(
    'conditions' => array(
    'Node.node_type_id' => '645' //tv shows
    ),
    'contain' => array(
    'AssociatedNode' => array(
    'conditions' => array(
    'AssociatedNode.node_type_id' => '239' //actors
    ),
    )
    )
    ));

    这行得通,我得到 ER -> George Clooney。

    但是 - 如果我想取消所有乔治克鲁尼参加的节目怎么办?
    $nodes = $this->Node->find('all', array(
    'conditions' => array(
    'Node.node_type_id' => '239' //actors
    ),
    'contain' => array(
    'AssociatedNode' => array(
    'conditions' => array(
    'AssociatedNode.node_type_id' => '645' //tv shows
    ),
    )
    )
    ));

    这不起作用,因为它正在寻找 George Clooney 的 ID 在 'node_id' 字段中,而 ER 的 ID 在 'associated_node_id' 字段中 - 而实际上它们是相反的。

    我想到的唯一解决方案是为每个关联保留两行。但这似乎有些矫枉过正。但是随后我必须想出某种自定义的东西,以确保每次保存或删除关联时都使每个副本与另一个副本保持同步......等等 - 这似乎是一大 jar 蠕虫。

    有什么我想念的吗?

    最佳答案

    您可能可以使用自定义查询来做到这一点,但为了保持标准的 Cake 函数,我能想到的一件事是声明节点之间的两种关系:

    public $hasAndBelongsToMany = array(
    'AssociatedNode1' => array(
    'className' => 'Node',
    'foreignKey' => 'node_id',
    'associationForeignKey' => 'associated_node_id',
    'joinTable' => 'node_associations'
    ),
    'AssociatedNode2' => array(
    'className' => 'Node',
    'foreignKey' => 'associated_node_id',
    'associationForeignKey' => 'node_id',
    'joinTable' => 'node_associations'
    )
    );

    然后您可以在 afterFind 回调中合并两个数组。
    function afterFind($results)
    {
    foreach($results as &$result)
    {
    if(isset($result['AssociatedNode1']) || isset($result['AssociatedNode2']))
    {
    $associated_nodes = array();

    if(isset($result['AssociatedNode1']))
    {
    foreach($result['AssociatedNode1'] as $associated_node)
    {
    $associated_nodes[] = $associated_node;
    }
    }

    if(isset($result['AssociatedNode2']))
    {
    foreach($result['AssociatedNode2'] as $associated_node)
    {
    $associated_nodes[] = $associated_node;
    }
    }

    $result['AssociatedNode'] = $associated_nodes;
    }
    }
    unset($result);

    return $results;
    }

    但这会迫使您在调用 contains(); 时同时声明 AssociatedNode1 和 AssociatedNode2;

    关于cakephp - 带有 self 的 HABTM 需要连接表中的 2 倍行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12232011/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com