2010-09-13 1 views
1

Я боролся с этим кодом:CakePHP возвращает пустой, но SQL запрос содержит результаты

function getNextActionFObyBalance($when) { 

    $theQuery = $this->find('first', array(
    'fields' => array(
    'Contract.id', 
    'Contract.start_balance' 
    ), 
    'conditions' => array(
    'AND' => array(
     'Status.next_action_by' => 'frontoffice', 
     'Status.status_type' => 'active', 
     'Status.visibility' => 'frontoffice', 
     'OR' => array(
     'Contract.next_action_on' => null, 
    'Contract.next_action_on <=' => $when 
    ) 
    )), 
    'order' => 'Contract.start_balance DESC', 
    'recursive' => 0, 
)); 
    return $theQuery; 
} 

Я позволил протоколирования на сервере MySQL в этом является то, что сервер указывает на то, что CakePHP запрашивает:

SELECT `Contract`.`id`, `Contract`.`start_balance` FROM `contracts` AS `Contract` LEFT JOIN `statuses` AS `Status` ON (`Contract`.`status_id` = `Status`.`id`) LEFT JOIN `users` AS `User` ON (`Contract`.`user_id` = `User`.`id`) WHERE ((`Status`.`next_action_by` = 'frontoffice') AND (`Status`.`status_type` = 'active') AND (`Status`.`visibility` = 'frontoffice') AND (((`Contract`.`next_action_on` IS NULL) OR (`Contract`.`next_action_on` <= '2010-09-13 10:13:04')))) ORDER BY `Contract`.`start_balance` DESC LIMIT 1 

Если я использую это в инструменте phpmyadmin, я получаю именно то, что ожидал 1 запись с двумя полями. BUT CakePHP просто дает мне пустой набор результатов. Может кто-нибудь просветить меня?

PS код работал, но я могу выяснить, что изменилось!

+0

У вас есть что-нибудь в методе afterFind любой из ваших моделей? AppModel, или текущая модель? –

ответ

0

Предположительно этот метод определен в моделях/contract.php?

Утверждение recursive = 0 выглядит немного подозрительным для меня. Правильно ли модели связаны с соответствующими файлами моделей?

Вы попробовали loadModel, если ассоциации не работают должным образом?

Было бы полезно увидеть определения отношений из соответствующих моделей.

--EDIT-- Я отформатированный код от вашего комментария здесь, как я не могу редактировать ваш OP

var $belongsTo = array(
    'Status' => array( 
     'className' => 'Status', 
     'foreignKey' => 'status_id', 
        ), 
    'User' => array( 
     'className' => 'User', 
     'foreignKey' => 'user_id', 
        ) 
       ); 

var $hasMany = array( 
    'Transaction' => array( 
     'className' => 'Transaction', 
     'foreignKey' => 'contract_id', 
     'dependent' => false, 
        ) 
       ); 
+0

вар $ belongsTo = массив ( \t 'Status' => массив ( \t \t 'имя класса' => 'Статус', \t \t 'ForeignKey' => 'status_id', \t \t 'условия' => '' , \t \t 'поля' => '', \t \t 'заказать' => '' \t), \t 'Пользователь' => массив ( \t \t 'имя класса' => 'Пользователь', \t \t 'ForeignKey' => 'user_id', \t \t 'условия' => '', \t \t 'поля' => '', \t \t 'заказать' => '' \t) ); вар $ hasMany = массив ( \t 'Сделка' => массив ( \t \t 'имя класса' => 'Сделка', \t \t 'ForeignKey' => 'contract_id', \t \t 'зависимой' => ложно, \t \t 'условия' => '', \t \t 'поля' => '', \t \t 'заказать' => '', \t \t 'предел' => '', \t \t 'смещение'=> '', \t \t 'эксклюзивный' => '', \t \t 'finderQuery' => '', \t \t 'counterQuery' => '' \t) ); – RaScoop

+0

Спасибо за ваш быстрый ответ. Метод действительно находится в файле contract.php в моделях. Изменение рекурсивного на 2 тоже не помогло. Что меня больше всего беспокоит, так это то, что Cake запрашивает результат с правильным SQL с сервера. Но он все еще возвращает пустой набор результатов. – RaScoop

+0

Этот код в модели контракта, я думаю. Как выглядит модель Status? – Leo

1

Проблема была с заглушкой, чтобы сделать некоторые постобработки afterFind. Проблема в том, что я полностью забыл вернуть $ results; Я нашел ошибку, выполнив пошаговую отладку метода find в файле model.php. Обнаружил, что после того, как находка была вызвана в какой-то момент и пошла проверять мой afterFind. Взял около 4 часов за простую ошибку, но я учусь!