действительно ли это плохой способ делать запросы по нескольким моделям HABTM? - PullRequest
0 голосов
/ 30 апреля 2011

Я пытаюсь выполнить запрос по двум таблицам HABTM.У меня Leases Managers Tenants Properties.

Managers HABTM Tenants
Managers HABTM Properties
Tenants HABTM Leases

Я хочу find список Properties, связанный с Managers, связанный с Tenant.Я смог выполнить запрос с помощью кода ниже, НО я могу получить только Property_id (из модели Managers_Property), но не Property.name (из модели Property).

У меня появляется ноющее чувство, что я делаю здесь что-то очень неправильное или ненужное, но я билась головой о стену и не могла этого понять.

    $conditionsSubQuery['`ManagersTenant`.`tenant_id`'] = $this->Auth->User('id');
        $dbo = $this->Lease->getDataSource();
        $subQuery = $dbo->buildStatement(
            // SELECT `ManagersTenant`.`manager_id` FROM `managers_tenants` AS `ManagersTenant`   WHERE `ManagersTenant`.`tenant_id` = $this->Auth->User('id')
            array(
                'fields' => array('`ManagersTenant`.`manager_id`'),
                'table' => $dbo->fullTableName($this->Lease->LeasesManager->Manager->ManagersTenant),
                //'table' => $dbo->fullTableName($this->Lease->Property->ManagersProperty->Manager->ManagersTenant),
                'alias' => 'ManagersTenant',
                'limit' => null,
                'offset' => null,
                'joins' => array(),
                'conditions' => $conditionsSubQuery,
                'order' => null,
                'group' => null
            ),
            $this->Lease->LeasesManager->Manager->ManagersTenant
            //$this->Lease->Property->ManagersProperty->Manager->ManagersTenant
        );
        $subQuery = ' `ManagersProperty`.`manager_id` IN (' . $subQuery . ') ';
        $subQueryExpression = $dbo->expression($subQuery);
        $conditions[] = $subQueryExpression;
        $properties = $this->Lease->Property->ManagersProperty->find('list', array(
            'conditions' => $conditions,
            'fields' => array('property_id',),
            'recursive' => 3
            )
        );

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 01 мая 2011

Похоже, вы должны использовать контейнерное поведение: http://book.cakephp.org/view/1323/Containable

$contain = array(
    'Manager' => array(
        'Property'
    )
);
$conditions = array('Tenant.id' => $this->Auth->user('id'));
$tenants = $this->Tenant->find('first', array('conditions'=>$conditions, 'contain'=>$contain));
...