2014-11-06 53 views
0

我想弄清楚如何跟踪不动产的业主。投资者具体。 (我花了几个小时研究并尝试不同的东西)Cakephp HABTM相同型号

我在同一模型上使用HABTM。 (见下文为什么)
我遇到的困难是在模型 - >找到。如果我要搜索的id位于关系表的第一列,它只会返回相关条目。

在实体表我有

1,Homer 
2,Springfield Nuclear 
3,Bart 

在entities_relateds

2,1 
2,3 

(为便于讨论,让我们姑且认为巴特长大,去在工厂上班。
所以两个& 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 
         ) 
       ) 
     ) 
) 

然而,如果entities_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.这些名称中的任何一个名称都可以是标题,并且实际上这些仅仅是同一个“组”的别名。

所以,我创建了一个名为'实体'的表。每条记录可以是真人或公司。它们具有很多相同的属性,但最重要的是,这两种类型都可以是一块不动产的合法所有者。

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' 
     ) 
    ); 

} 

回答

0

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

$this->Entity->recursive = 1 

然后尝试执行查找。

如果这不起作用,我会给containable behavior一个镜头,这比搞模型的递归更好。
如果选择ContainableBehavior工作您发现最终会是这样的:

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

更新1:增加中容纳的代码。