2015-01-06 2 views
0

Мой б CakePHP версии 3.x мне нужно CakePHP, чтобы создать этот SQL заявление:CakePHP - создание подзапрос

SELECT messages.id, message, receiver_id, sender_id, conversation_id, users.id, users.username FROM 
(
    SELECT messages.id, message, receiver_id, sender_id, conversation_id 
    FROM messages as messages 
    ORDER BY created DESC 
) AS messages 
left join users on (users.id = sender_id) 
WHERE (sender_id = 13 or receiver_id =13) 
GROUP BY conversation_id; 

Я использовал QueryBuilder, но я не очень понимаю, что им делать;)

Это мой торт код:

$subquery = $messages->find() 
     ->order(['Messages.created' => 'DESC']); 
    debug($neededMessages = $messages->find('all') 
     ->select() 
     ->group('Messages.conversation_id') 
     ->contain(['Users']) 
     ->where(['OR' => ['sender_id' => $userId, ['receiver_id' => $userId]]])); 
    $neededMessages->execute(); 

Я думаю, что его только маленькую ошибку там. Пирожные отладочный вывод заключается в следующем: SELECT (ВЫБОР Messages.id КАК Messages__id, Messages.subject А.С. Messages__subject, Messages.message А.С. Messages__message, Messages.created А.С. Messages__created, Messages.conversation_id А.С. Messages__conversation_id, Messages.is_new А.С. Messages__is_new, Messages.receiver_id AS Messages__receiver_id, Messages.sender_id AS Messages__sender_id ОТ сообщений Сообщения ORDER BY Messages.created DESC) FROM сообщений Сообщения INNER JOIN пользователи Пользователи ON Users.id = (Messages.sender_id) WHERE (sender_id =: c0 OR receiver_id =: c1) GROUP BY Messages .conversation_id

im отсутствует столбцы в первом заявлении выбора. Может ли кто-нибудь помочь в решении этой проблемы? grretings maik ...

+0

Вы должны добавить информацию о версии CakePHP и схемы базы данных для четко. –

+0

извините, cakePHP 3.x Я добавил эту информацию на свой пост :) спасибо –

+0

Это просто пример, который не имеет никакого смысла в праве? Потому что подзапрос не делает ничего особенного, что делает его использование необходимым. В любом случае, я думаю, проблема в том, что вы не можете легко изменить псевдоним поля, который необходим в подзапросе, потому что в противном случае вы получите такие поля, как 'Messages.id AS Messages__id', что вызовет внешний выбор 'Messages.id' - сбой. Возможно, попросите мастера ORM и часть времени leprechaun tamer _jose_zap_ в IRC, если он знает обходной путь. – ndm

ответ

-1

Почему бы вам не написать его вручную как команду SQL? Я не думаю, что CakePHP поддерживает вложенные запросы.

$this->Model->query($query_string); 
+0

Хм ... это было бы самым простым способом. Но я думаю, что торт должен иметь возможность выполнять эти вложенные запросы. О, я не сказал, что я использую cakePHP 3 –

+0

Я не знаю о CakePHP 3 ... У меня была аналогичная проблема в версии 2.6 и я решил ее таким образом. – Skatch

0

Итак, у меня есть мои результаты, как мне нужно. Единственное, что меня беспокоит, это то, что теперь у меня есть массивы и объекты. Вот мой код:

$conn = ConnectionManager::get('default'); $stmt = $conn->query('SELECT max(m.id) as message_id, message, receiver_id, sender_id, m.conversation_id, users.id as user_id, users.username from (select id, message, receiver_id, sender_id, conversation_id from messages order by created desc) as m left join users as users on (m.sender_id = users.id) group by m.conversation_id'); $messages = $stmt->fetchAll('assoc'); $this->set('messages', $messages);

Было бы здорово, чтобы прочитать от других пользователей торт, как они решают эту «проблему» ...

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