2015-03-25 4 views
0

У меня проблема с CakePHP:CakePHP игнорирует состояние

Две таблицы объединены (фильтры и учетные записи). Затем я создаю условия, и выполняется только второе условие Account.active =>1. Если я печатаю результат, есть все еще показывают фильтры, имеющие другое mode_id чем 3.

$joins= array( 
    array('table' => 'filters', 
      'alias' => 'Filter', 
      'type' => 'right', 
      'conditions' => array(
      'Filter.account_id = Account.id', 
       ) 
      ), 
     ); 

Затем я выполнить запрос, включая соединения и условия были проверены

$activeAccounts = $this->Account->find('all',array(
'conditions'=>array('AND'=>array('Filter.mode_id'=>3,'Account.active'=>1)), 
'joins'=>$joins)); 

Модели и никаких проблем не выявлено , Фильтр принадлежит учетной записи. У учетной записи много фильтров.

Ниже запроса, который сгенерирован. Результаты по-прежнему показывают фильтры с Filter.mode_id, отличными от 3

Вот запрос, который сгенерирован. Результаты еще содержит строки с Filter.mode_id, кроме 3, несмотря на то, что одно условие «Filter.mode_id» => 3

SELECT `Account`.`id`, `Account`.`user_id`, `Account`.`name`, 
`Account`.`api_key`, `Account`.`account_number`, `Account`.`remaining_balance`, 
`Account`.`investment_size`, `Account`.`active` 
FROM `baseline_db`.`accounts` AS `Account` 
right JOIN `baseline_db`.`filters` AS `Filter` 
    ON (`Filter`.`account_id` = `Account`.`id`) 
WHERE ((`Filter`.`mode_id` = 3) AND 
(`Account`.`active` = '1')) 
+1

Ассоциации не будут иметь никакого отношения, если вы выполняете ручное соединение. Укажите запрос, который он генерирует. – Dave

+0

Любая причина, по которой вы не используете [Ассоциации моделей] (http://book.cakephp.org/3.0/en/orm/associations.html)? Это сделает вашу жизнь намного проще. – Oldskool

+0

Это не решит вашу проблему, но вы не должны использовать ** right ** join. Необходимо использовать ** внутреннее ** соединение. Попробуйте установить свой рекурсивный флаг на -1 для этой находки. _ (Обратите внимание, что сгенерированный запрос не возвращает столбцы таблицы фильтров. Вы действительно должны использовать [сдерживаемое поведение] (http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html)) _. – AgRizzo

ответ

0

Как говорят Oldskool, использовать модель ассоциации и для вашего состояния, «И» не надо, вы не можете ставить:

$activeAccounts = $this->Account->find('all',array(
    'conditions' => array(
     'Filter.mode_id'=>3, 
     'Account.active'=>1 
    ) 
)); 
+0

Я пробовал, но получаю «Столбец не найден: 1054 Неизвестный столбец« Фильтр.mode_id »в разделе« where ». Интересно, допустил ли я ошибку в модельной ассоциации. – user1171243

+0

Фильтр вашего состояния не может иметь полей из модели, связанной с hasMany. – AgRizzo

0

запрос вы хотите сделать с типом отношения у вас есть, кажется мне странным. Если я понимаю, возможно, с чем-то вроде этого:

$this->loadModel('Filter'); 
$filters =$this->Filter->find("list", array(
    'conditions' => array('Filter.mode_id' => 3), 
    'fields' => array('Filter.account_id') 
)); 
$activeAccounts = $this->Account->find('all',array(
    'conditions' => array(
     'Account.account_id'=>$filters, 
     'Account.active'=>1 
    ) 
)); 
+0

Спасибо, Мато. Проблема в том, что у меня есть два разных запроса. Я хочу получить один результат и исключить все неактивные учетные записи и все фильтры, которые не находятся в режиме 3. Режим 3 означает, что фильтр активен. Итог: один запрос со всеми учетными записями, содержащий связанные с ними активные фильтры. – user1171243