2013-09-28 2 views
0

У меня есть SQL-запрос, который я пытаюсь преобразовать в CakePHP find, но я не уверен, как его структурировать ... может кто-то, пожалуйста, немного помог?Написание CakePHP найти Присоединиться

SELECT texts.*, people.id, people.first_name, people.last_name FROM texts 
    NATURAL JOIN (
     SELECT person_id, MAX(id) AS id 
     FROM texts 
     WHERE texts.status = 'received' 
     GROUP BY person_id 
    ) t RIGHT JOIN people ON people.id = t.person_id 
    WHERE texts.body is not null 
    AND texts.created > '$since' 
    AND person.counselor_id = '2' 
    ORDER BY texts.created DESC 

Вот что у меня есть

$texts = $this->find('all', array(
     'recursive' => -1, 
     'joins' => array(
      array(
       'table' => 'texts', 
       'alias' => 't', 
       'type' => 'NATURAL', 
       'conditions' => array('t.status' => 'received') 
      ), 
      array(
       'table' => 'people', 
       'alias' => 'Person', 
       'type' => 'RIGHT', 
       'conditions' => 'people.id = t.person_id' 
      ) 
     ), 
     'conditions' => array('AND' => array('Text.body IS NOT NULL', 'Text.created > 0000-00-00 00:00:00')), 
     'order' => 'Text.created DESC' 
    )); 

Это SQL пишет

SELECT Text.id, Text.person_id, Text.sid, Text.to, Text.from, Text.body, Text.status, 
    Text.direction, Text.owner, Text.counselor_read, Text.created, Text.modified 
FROM admissionsedge_penfield.texts AS Text 
NATURAL JOIN admissionsedge_penfield.texts 
AS t ON (t.status = 'received') 
RIGHT JOIN admissionsedge_penfield.people AS Person ON (people.id = t.person_id) 
WHERE ((Text.body IS NOT NULL) AND (Text.created > 0000-00-00 00:00:00)) 
ORDER BY Text.created DESC 

Спасибо!

+1

I подставка исправлена. Оставшийся элемент - это производная таблица. Рекомендация (надеюсь, лучше, чем моя последняя) заключается в том, чтобы сделать производную таблицу представлением MySQL, а затем ссылаться на представление в предложении соединения cakephp. – AgRizzo

ответ

1

Есть ли у вас какие-либо модели? Если это так, вам нужно поделиться им, а также с какой из них вы ожидаете выполнить поиск, потому что правого соединения обычно не используется И Природный Присоединиться не используется.

Предполагая, что вы не ...

В контроллере, выполнить запрос выше с этим кодом. {Строки $ назначение записей будет где метод находки, как правило, идет}

$some_sql = 'your sql statement'; 
$db = ConnectionManager::getDataSource('default'); 
$recordset = $db->rawQuery($some_sql); 
set('recordset', $recordset); 

Если вы хотите использовать MVC CakePHP, тогда я предлагаю этот запрос можно переписать в виде левого соединения и внутренние соединения

+0

было бы лучше вызвать запрос на (например) модель «Текст» или вызвать метод $ this-> Text-> putnamehere() ', который инкапсулирует вызов на запрос, т. Е. Избегает помещать sql в контроллеры, поскольку они должны" t знать/заботиться о sql вообще. Совет по реструктуризации запроса для использования соединений LEFT/RIGHT, по-видимому, подходит, как таковой +1. – AD7six

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