【问题标题】:Sending datas to multiple tables - CakePHP 3.2将数据发送到多个表 - CakePHP 3.2
【发布时间】:2017-03-17 17:40:48
【问题描述】:

我正在尝试做一个聊天系统,我遇到了麻烦,我的想法如下:
当用户发送消息时,该消息必须保存在我的数据库中的 2 个表中...但它不起作用,该消息仅保存在一个表中。

公共函数 sendMessage()

    $data = $this->request->data();
    $sessionId = $data['idSession'];
    $userId = $this->request->session()->read('Auth.User.id');
    $msg = $data['message'];
    $typeMessage = $data['type'];
    $messageTable = TableRegistry::get('messages');
    $messageAllTable = TableRegistry::get('mensage_alls');
    if ($typeMessage == 1)
    {      
        $message['session_private_id'] = $sessionId;
    }
    else
    {
        $message['session_id'] = $sessionId;
    }
    $message = array_merge($message, array(
        'user_id' => $userId,
        'message' => $msg,
        'created_at' => new \DateTime(date("Y-m-d H:i:s")),
    ));
    $messageEntity = $messageTable->newEntity();
    $messageEntity = $messageTable->patchEntity($messageEntity, $message, ['validate' => false]);
    $resposta = $messageTable->save($messageEntity);
    $this->response->body($resposta);
    return $this->response;

我是 CakePHP 的初学者,所以,不要说我笨。
从现在开始感谢。对不起,我的英语不好。

【问题讨论】:

    标签: php cakephp frameworks cakephp-3.0


    【解决方案1】:

    忽略您想要复制数据的原因(一般来说这听起来不是一件好事),它不起作用的原因是您从未将其保存到第二个表中。您至少需要调用以下内容:

    $resposta = $messageTable->save($messageEntity);
    $messageCopy = $messageAllTable->newEntity($messageEntity);
    $respostaCopy = $messageAllTable->save($messageCopy);
    $this->response->body($resposta && $respostaCopy);
    

    如果您的意思是始终自动复制到辅助表,则可以改为将Behavior 添加到主消息表。例如,一个简单的版本看起来像:

    在 MessageTable.php 中:

    namespace App\Model\Table;
    
    use Cake\ORM\Table;
    
    class MessageTable extends Table
    {
    
        public function initialize(array $config)
        {
            // Add this line
            $this->addBehavior('CopyMessage');
        }
    }
    

    并创建一个src/Model/Behavior/CopyMessageBehavior.php:

    namespace App\Model\Behavior;
    
    use Cake\ORM\Behavior;
    
    class CopyMessageBehavior extends Behavior
    {
        public function copyMessage(Entity $entity)
        {
            $messageAllTable = TableRegistry::get('mensage_alls');
            $messageCopy =messageAllTable->newEntity($messageEntity);
            $messageAllTable->save($messageCopy);
        }
       public function beforeSave(Event $event, EntityInterface $entity)
        {
            $this->copyMessage($entity);
        }
    }
    

    【讨论】:

    • 我也不鼓励关闭验证。也许重新评估你为什么要复制数据,看看是否有可能有一个更干净的表结构(可能有)。在您的示例中也不需要返回行。
    • 哦,还有一件事 - 与其手动跟踪 date_created,不如查看内置的 Timestamp Behavior
    • 嘿ahoffner,感谢您的回答。原因是:有人在流式传输视频(例如 Twitch),也有人在观看流式传输。在我的聊天系统中,当主播发送消息时,该消息会显示给所有人,但是当观众发送消息时,只会显示主播的消息,而不是每个人。出于这个原因,我想向 2 个不同的表发送消息,当流媒体发送消息时转到:“messages”和“message_alls”,当查看者发送消息时,我只想在“消息”表中显示这条消息。你明白了吗?
    • 我可能仍然会为此使用一个表 - 因为它们都是消息,所以将它们存储在一起会更干净。而是过滤这些消息的视图。您可以加入 User_id,并可能以这种方式将“观众”的消息过滤到流媒体的消息。
    • 好的,我试试这个方法,谢谢你的帮助,如果有问题,我回来告诉你。从一开始我就喜欢你的方式,但是我的老板想要这样......那么,我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多