2014-11-06 4 views
0

Я пытаюсь выяснить, как отслеживать владельцев недвижимости. Инвесторы конкретно. (я часами занимался исследованиями и пробовал разные вещи)Cakephp HABTM та же модель

Я использую HABTM на той же модели. (см. ниже почему)
Сложность, которую я испытываю, находится на модели-> нахождении. Он возвращает только связанные записи, если id, который я ищу, находится в первом столбце таблицы отношений.

В таблице сущностей У меня есть

1,Homer 
2,Springfield Nuclear 
3,Bart 

В entities_relateds

2,1 
2,3 

(ради аргумента, давайте предположим, что Барт вырос и пошел работать на заводе.
Таким образом, оба 1 & 3 относятся к 2.)

If if do

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

UPDATE 1: Добавлен Containable код.

Смежные вопросы