Cakephp HABTM同型号

时间:2014-11-06 18:28:32

标签: cakephp-2.0 has-and-belongs-to-many

我试图弄清楚如何跟踪不动产的所有者。投资者具体而言。 (我确实花了几个小时研究和尝试不同的事情)

我在同一型号上使用HABTM。 (见下文为何原因)
我遇到的困难在于模型 - >查找。如果搜索的id我在关系表的第一列中,它仅返回相关条目。

在实体表中我有

1,Homer
2,Springfield Nuclear
3,Bart

在entities_relateds

2,1
2,3

(为了论证,让我们假设巴特长大并去工厂工作。
所以1& 3与2相关。)

如果有的话

$this->Entity->findById(2);

看起来很棒。

Array
(
    [0] => Array
        (
            [Related] => Array
                (
                    [id] => 2
                    [name] => Springfield Nuclear
                    [0] => Array
                        (
                            [id] => 1
                            [name] => Bart
                        )

                    [1] => Array
                        (
                            [id] => 3
                            [name] => Homer
                        )
                )
        )
)

但是,如果entity_relateds的第一行中的值被反转......

1,2
2,3

我得到了

Array
(
[0] => Array
    (
        [Related] => Array
            (
                [id] => 2
                [name] => Springfield Nuclear
                [0] => Array
                    (
                        [id] => 3
                        [name] => Homer
                    )
            )
    )

)

它没有返回第一行。 如果我这样做并不重要

$this->Entity->Related->findById(2);

它稍微改变了数组,但仍然没有返回第一行。

我对如何解决此问题提出了其他建议。

感谢。

下面有更多信息。

方案: 让人们在交易中合作并以自己的名义或任何一个不同的公司拥有房产是很常见的。合作伙伴A,合作伙伴B,公司A,公司B.这些名称中的任何一个都可以是标题,实际上这些只是同一组'的其他名称。

所以,我创建了一个名为' entities'的表。每条记录可以是真人,也可以是公司。它们共享许多相同的属性,但最重要的是,任何一种类型都可以成为不动产的合法所有者。

CREATE TABLE `entities` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NULL DEFAULT NULL,
   PRIMARY KEY (`id`)
)

关系表:

CREATE TABLE `entities_relateds` (
  `entity_id` INT(11) NOT NULL DEFAULT '0',
  `related_id` INT(11) NOT NULL DEFAULT '0',
   PRIMARY KEY (`entity_id`, `related_id`)
)

模型HATBM

App::uses('AppModel', 'Model');

class Entity extends AppModel {

    public $hasAndBelongsToMany = array(
        'Related' => array(
            'className' => 'Entity',
            'joinTable' => 'entities_relateds',
            'foreignKey' => 'entity_id',
            'associationForeignKey' => 'related_id',
            'unique' => 'keepExisting'
         )
    );

}

1 个答案:

答案 0 :(得分:0)

我建议你尝试将模型的递归设置为1,如:

$this->Entity->recursive = 1

然后尝试进行查找。

如果这不起作用,我会给containable behavior一个镜头,这比弄乱模型的递归更好。
如果您选择使用ContainableBehavior,您的查找将最终如下:

$this->Entity->find('all', 
          array(
                'conditions'=>array('id'=>2), 
                'contain'=>array('Related')
          )
);

更新1:添加了可包含的代码。