cakephp содержит

У меня проблема с контейнером :( , позвольте мне объяснить:

Отношения моделей:

Клиент -> hasMany -> Карта -> hasAndBelongsToMany -> Партнер -> hasMany -> Контакты

Мне нужно получить всех партнеров и контакты клиента с codigo = 24150 и контакты с coords_lat = 38.71093.

Код:

$conditions = array('conditions' => 
   array('codigo' => '24150')
);

$contain = array(
   'contain'=> array(
    'Partner' => array(
       'Contact' => array('conditions' => array('coords_lat' => '38.71093')) 
    )
   )
);

$parceiros = $this->Client->find('all', array($conditions, $contain));

я добавил

var $actsAs = array('Containable'); 

в app_model.php

Чтобы быть полностью честным с вами, я действительно не понимаю, что здесь происходит... правда в том, что mysql выполняет огромные запросы и занимает кучу времени, но я не вижу, чтобы он выбирал "codigo = 24150"

Буду признателен за помощь.

Заранее спасибо.

Руи


person Rui    schedule 05.04.2011    source источник
comment
Какой результат вы получаете прямо сейчас? Каково содержание $parceiros?   -  person vindia    schedule 05.04.2011
comment
Я думаю, вам следует проверить ответ @Leo. Вероятно, здесь вы ошибаетесь. Ваш синтаксис выглядит нормально.   -  person vindia    schedule 05.04.2011
comment
Нет вывода... потому что cakephp генерирует сумасшедшие запросы, проверьте здесь: pastebin.me/24d7e33ce334e56087dcb657080325ce имя таблиц, они на португальском языке Cliente = Cliente, CgdCartoesCliente = Card, cgd_cartoes_clientes = таблица соединений HATBM   -  person Rui    schedule 05.04.2011


Ответы (3)


Вы также можете разделить оба массива $conditions и $contain.

и измените последнюю строку на:

$parceiros = $this->Client->find('all', array_merge($conditions, $contain));

обратите внимание на функцию array_merge..
это должно решить вашу проблему без необходимости использовать только один массив для обоих из них

person Mouad Debbar    schedule 05.04.2011

Наконец исправил это, cakephp не любил иметь условия и содержать в разных массивах. Решение для этого:

$conditions = array(
    'conditions' => array('codigo' => '24150'),
    'contain' => array(
        'Card'=>array(
            'Partner' => array (
                'Contact' => array(
                    'conditions' => array('Contact.coords_lat' => '38.710930')
                 )
             )
         )
     )
 );

 $parceiros = $this->Client->find('all', $conditions);
person Rui    schedule 05.04.2011

Вы должны получить сообщение об ошибке о том, что клиент не связан с партнером. Попробуйте следующее

$this->Client->contain(
    'Card'=>array('Partner' => array(
       'Contact' => array('conditions' => array('coords_lat' => '38.71093')) 
    )
   )
)
);

$parceiros = $this->Client->find('all', array('conditions' => 
                                            array('Client.codigo' => '24150')
                                            )
                                  )
person Leo    schedule 05.04.2011
comment
Не повезло .... по-прежнему генерирует длинные запросы и тайм-аут mysql :( также я не вижу, чтобы он выбирал codigo 24150. Пожалуйста, проверьте запросы здесь: pastebin.me/24d7e33ce334e56087dcb657080325ce - person Rui; 05.04.2011
comment
ОК, Руи, давайте попробуем небольшой процесс исключения. Закомментируйте строку $this-›Client-›contain. Затем pr() содержимое $parceiros, что вы получаете? - person Leo; 05.04.2011
comment
Что-то странное, видимо $conditions игнорируются при поиске :( Я добавил recursive = -1 и сгенерированный запрос select * from clientes WHERE 1 = 1 ? :( - person Rui; 05.04.2011
comment
Так он вернул всех Клиентов? снова выполните только последнюю строку (я изменил ее, включив в нее название модели) - person Leo; 05.04.2011
comment
Сейчас уже лучше.... Вернули Клиента и Карты... но не вернули Партнеров и Контакты. (Я раскомментировал строку содержимого) - person Rui; 05.04.2011
comment
Прямо сейчас мы ходим по кругу. Выполняя ТОЛЬКО последнюю строку, вы получаете клиентов, возвращаемых с «codigo» 24150 - person Leo; 05.04.2011
comment
Лео, да.... и с картами тоже. Он возвращает Клиенту кодиго 24150 и его карты (идентификаторы 14,23,29)... - person Rui; 05.04.2011
comment
Хорошо, если вы ничего не получаете с раскомментированным содержанием, у вас могут быть проблемы с вашими отношениями. Установите recursive на 2 и что вы получите? - person Leo; 05.04.2011
comment
Я попытался установить рекурсивность на 5... и я получаю все отношения в порядке... когда я добавляю содержимое, он перестает работать... также "условия" => массив ('coords_lat' => '38.71093') кажется игнорируется. - person Rui; 05.04.2011
comment
попытался упростить содержимое: $this-›Client-›contain = array('Card'=›array('Partner')); но тоже не работает :( - person Rui; 05.04.2011
comment
Не беспокойтесь, я по глупости назначал массив $this-›client-›contain, что, очевидно, является методом. Я повторно отредактировал свой код - person Leo; 06.04.2011