vitalikk
@vitalikk
Веб-разработчик на Yii Framework

Как выбрать всех адресатов из базы сообщений?

Есть таблица личных сообщений внутренней почты сервиса. Для проблемы значимыми являются такие поля:



  • ID сообщения
  • ID отправителя
  • ID получателя
  • Текст сообщения
  • Дата отправки


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



Использую Yii, может, в нем есть какие-то готовые решения для этого велосипеда?
  • Вопрос задан
  • 3733 просмотра
Решения вопроса 1
mrspd
@mrspd
Вот по сути решение: goo.gl/s724k, но там с подзапросом, хотя я думаю иначе никак.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
mrspd
@mrspd
Я бы на вашем месте хранил бы где-нибудь еще id последнего сообщения в каждом диалоге. Тогда можно было бы выбрать все записи из базы где текущий пользователь либо получатель либо отправитель, и потом как раз сгруппировать по id последнего сообщения. Тогда бы вы получили все последние сообщения этого пользователя.
Ответ написан
$criteria = new CDbCriteria();
$criteria->distinct = true;
$criteria->addCondition('sender_id = :sender');
$criteria->select('recipient_id');
$criteria->params = array(':sender' => Yii::app()->getUser()->getId());

$userMessages = Messages::model()->findAll($criteria);
$uniqRecipients = array();
foreach($userMessages as $model)
   $uniqRecipients[] = $model->recipient_id;


что то типо такого. Код не рабочий, писал сразу в комментарий.
Ответ написан
newpdv
@newpdv
Web-devekioer
Недавно решал такую задачу у себя. Правда на Zend. Вот как сделал:

$mess_db = new Application_Model_DbTable_Message();
$user_id = ...;

$mess_list = $mess_db->getMessageList($user_id);

foreach ($mess_list as $mess){
  if(!isset($dialog_list[$dialog_companion])){
    $dialog_list[$dialog_companion] = $mess;
  }
}

$this->view->dialogs = $dialog_list;


Срузу получаю массив «диалогов» и последнее сообщение.

$mess_db->getMessageList — модель, возвращает массив всех сообщений пользователя.
Ответ написан
RUgaleFF
@RUgaleFF
SELECT 
  `pm`.*,
  `recipient`.* 
FROM
  `private_message` `pm` 
  LEFT OUTER JOIN `user` `recipient` 
    ON (
      `pm`.`recipient_id` = `recipient`.`id`
    ) 
WHERE `sender_id` = 5 
GROUP BY `recipient_id` 
ORDER BY `pm`.`create` ASC;


Вот SQL решение для моей схемы. Подогнать под Yii проблем составить не должно.
В модели юзеров:
public function relations()
{
return array(
'lastMessage' => array(self::HAS_ONE, 'PrivateMessage', 'recipient_id', 'order' => 'lastMessage.time DESC'),
'messages' => array(self::HAS_MANY, 'PrivateMessage', 'recipient_id', 'order' => 'lastMessage.time DESC'),
}


Выбирать как:
$criteria->with = array('messages' => array('with' => 'recipient'), 'lastMessage');
$criteria->group = 'recipient.id';


Что-то вроде того
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы