消息/聊天系统-将消息定向到多个收件人

时间:2020-04-07 17:23:06

标签: php

我已经建立了一个消息传递/聊天系统,我需要扩展它的功能。用户发布消息时,他们可以选择将消息定向到一个或多个用户。这是我制作的两个表的结构。

chat_message    CREATE TABLE `chat_message` (
 `chat_message_id` int(11) NOT NULL AUTO_INCREMENT,
 `order_id` int(11) DEFAULT NULL,
 `chat_message` text NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'time message was sent',
 PRIMARY KEY (`chat_message_id`)
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=latin1

chat_to_users   CREATE TABLE `chat_to_users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `message_id` int(11) NOT NULL,
 `to_user_id` int(11) NOT NULL DEFAULT 0,
 `from_user_id` int(11) NOT NULL,
 `read_timestamp` timestamp NULL DEFAULT NULL COMMENT 'time user read message',
 `status` int(1) NOT NULL DEFAULT 0,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=latin1

我正在尝试输出消息:https://imgur.com/qaAZhey

这实际上是3条消息,但总共显示5条消息,因为3条消息中有2条针对多个用户。

我希望它显示更多类似“发件人:from_user-收件人:to_user1,to_user2等”的信息。如果邮件定向到一个以上的人,则只需添加其他用户名即可。

这是我的PHP:

<?php
function fetch_order_messaging_history( $order_id, $pdo ) {

    //construct SQL query
    $query = "
             SELECT 
             msg.chat_message_id,
             msg.order_id,
             msg.chat_message,
             msg.timestamp AS sent_timestamp,
             usr.id AS chat_to_users_id,
             usr.message_id,
             usr.to_user_id,
             usr.from_user_id,
             usr.read_timestamp AS read_timestamp,
             usr.status
             FROM chat_message AS msg 
             LEFT JOIN chat_to_users AS usr 
             ON msg.chat_message_id = usr.message_id 
             WHERE msg.order_id = $order_id 
             ORDER BY msg.timestamp DESC
             ";

    //prep, execute, & fetch SQL results
    $statement = $pdo->prepare ( $query );
    $statement->execute();
    $result = $statement->fetchAll();

    //construct HTML for browser output
    $output = '<ul class="list-unstyled">';

    foreach ( $result as $row ) {
        $user_name = '';

        $track_msg_id = $row['chat_message_id'];

        if ( $row[ 'from_user_id' ] == $_SESSION['user_id' ] ) {
            $from_user_name = '<b class="text-success">You</b>';
        } else {
            $from_user_name = '<b class="text-success">' . get_user_name( $row[ 'from_user_id' ], $pdo ) . '</b>';
        }

        $output .=  '
                    <li style="border-bottom:1px dotted #ccc">
                        <p>' . 'From: ' . $from_user_name . ' To: ' . get_user_name( $row[ 'to_user_id' ], $pdo ) . ' - '. $row[ 'chat_message' ] . '
                            <div align="right">
                            - <small><em>' . $row[ 'sent_timestamp' ] . '</em></small>
                            </div>
                        </p>
                    </li>
                    ';

    }

    $output .= '</ul>';

    //output HTML to browser
    return $output;
}
?>

1 个答案:

答案 0 :(得分:1)

您可以使用GROUP_CONCAT()聚合公式和GROUP BY来完成此操作:

         SELECT 
         msg.chat_message_id,
         msg.order_id,
         msg.chat_message,
         msg.timestamp AS sent_timestamp,
         usr.id AS chat_to_users_id,
         usr.message_id,
         GROUP_CONCAT(usr.to_user_id SEPARATOR ',') AS to_user_ids,
         usr.from_user_id,
         usr.read_timestamp AS read_timestamp,
         usr.status
         FROM chat_message AS msg 
         LEFT JOIN chat_to_users AS usr 
         ON msg.chat_message_id = usr.message_id 
         WHERE msg.order_id = $order_id 
         GROUP BY
           msg.chat_message_id,
           msg.order_id,
           msg.chat_message,
           msg.timestamp,
           usr.id,
           usr.message_id,
           usr.from_user_id,
           usr.read_timestamp,
           usr.status
         ORDER BY msg.timestamp DESC

如果每个记录的read_timestampstatus也不同,则可能必须弄清楚如何汇总(分组,求和,选择“最大”等)。