2012-02-09 1 views
1

У меня есть две темы и сообщения в таблице. Отношения: темы hasmany posts. В обеих таблицах есть поле состояния (Y, N) для смягчения содержимого. На моей странице я хочу перечислить все немоделированные темы, для которых по крайней мере один статус сообщения - это N или статус темы: N. Возможно ли это сделать с функцией find в cakephp2.0. Я использую Containable поведение.Cakephp complex find condition with count on child table

Мне также нужно применить разбивку на страницы.

ответ

1

Это одно решение:

  1. Поиск по модель Post для (Сообщения с статусом N) ИЛИ (Сообщения, связанные с темами с статусом N) a го хранения topic_id
  2. Теперь поиск по модели Тема для темы с ID в списке

Что-то вроде этого:

# TopicsController.php 

$ids = $this->Topic->Post->find('list', array(
    'fields' => array('Post.topic_id') 
    'conditions' => array(
     'OR' => array(
      'Post.status' => 'N', 
      'Topic.status' => 'N', 
     ) 
    ) 
)); 

$this->paginate = array(
    'conditions' => array('Topic.id' => (array)$ids), 
    'order' => array('Topic.created' => 'DESC') 
); 

$topics = $this->paginate('Topic'); 

Поскольку вы seaching на модели сообщений , CakePHP присоединится к родительским данным темы, и вы можете фильтровать оба состояния. :)

+0

Спасибо .. Но мне нужно применить разбивку на страницы. Поэтому каждый раз мне нужно получить все списки идентификаторов – binoy

+1

@binoy, которые я обновил .. теперь он разбивает страницы на данные. Вам нужно будет искать все идентификаторы до разбивки на страницы, поскольку ваша разбивка на страницы не основана на прямом запросе. У вас почти есть подзапрос здесь –

1

Если я правильно понимаю, вы можете использовать:

$conditions => array ('OR' => array ('Topic.status' => 'N', 'Post.status' => 'N')); 
+0

Спасибо за ответ. Я объясню. Мне нужно только перечислить темы. Например: если в topic1 есть две должности postA и postB, и если статус postA равен N, я хочу указать topic1. Также, если есть тема2 без сообщений и статуса, как N, я тоже хочу перечислить – binoy

1

Ну я не проверял, но должно работать

$this->recursive = -1;  //necessary to use joins 

    $options['joins'] = array(
    'table' => 'posts', 
    'alias' => 'Post', 
    'type' => 'left', 
    'conditions' => array('Topic.id = Post.topic_id', 'Post.status = N') //updated code 
    ); 
    $options['group'] = array('Topic.id HAVING count('Topic.id') >= 1 OR Topic.status = N'); 
    $this->Topic->find('all', $options); 
+0

Спасибо .. Кажется, это не работает в cakephp2.x. Показывать запрос как SELECT 'Тема'.' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' ', FROM' themes' AS 'Тема' сообщения Сообщение LEFT Array WHERE 1 = 1 GROUP BY' Тема'.'id' HAVING count ('Post'.'id)> = 1 ИЛИ' Тема'.'status' = 'N' – binoy

+0

Я получил как $ this-> Тема-> find ('all', array ( 'joins' => array ( 'table' => 'posts', 'alias' => 'Post' , 'типа' => 'ЛЕВОГО', ' условия' => Array ('Topic.id = Post.topic_id И Post.status = '' ), N) 'группы'=> массив (' Topic.id HAVING count (Post.id)> = 1 ИЛИ Topic.status = 'N' )))); – binoy

+0

Я обновил сообщение. посмотрите, помогает ли это. – Ehtesham

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

  • Нет связанных вопросов^_^