sql >> データベース >  >> RDS >> PostgreSQL

アプリのチャット部分を構成する方法を続編しますか?

    すべてのモデルがよさそうだ。問題は協会にあります。

    同じ2つのモデル間に複数の関連付けを定義する場合は、クエリでそれらを互いに区別するために、異なるエイリアスを指定する必要があります。

    User.hasMany(Messages, {
    foreignKey: 'senderId',
    as: 'OutgoingMessages'
    });
    
    User.hasMany(Messages, {
    foreignKey: 'receiverId',
    as: 'IncomingMessages'
    });
    
    Messages.belongsTo(models.User, {
    foreignKey: "senderId",
    as: 'Sender'
    });
    Messages.belongsTo(models.User, {
    foreignKey: "receiverId",
    as: 'Receiver'
    });
    

    また、モデル定義の直後、またはassociateのような静的メソッドのいずれかで、同じ方法で関連付けを定義することをお勧めします。 。後者のアプローチは、modelsを使用して相互参照することなく、独自のモジュールで各モデルを定義できるため、望ましい方法です。 associateのパラメータ 特定のモデルに関連付ける必要がある他のモデルにアクセスする方法。

    最後の注意:アソシエーション定義の左側にあるモデルが独自のassociateでアソシエーションを定義してみてください メソッド。つまり

    models.Message.belongsTo(Conversations);
    

    Messageに含める必要があります モデルassociate 方法:

    Message.belongsTo(models.Conversations);
    

    そうすれば、特定のモデルから他のモデルへのリンクを定義するすべての関連付けを見つける場所を常に知ることができます。

    更新

    メッセージの作成中に使用するには、見つかった会話または作成した会話を変数に保存する必要があります。

    let conversation = await Conversations.findOne({
      where:{
        user1:{[Op.or]:[req.user.id,post.userId]},
        user2:{[Op.or]:[req.user.id,post.userId]},
        PostId:req.body.postId,
      }
    })
    
    if (!conversation){
      conversation = await Conversations.create({
        user1: req.user.id,
        user2: post.userId,
        PostId:req.body.postId,
      })
    }
    const newMessage = await Messages.create({
      senderId: req.user.id,
      receiverId: post.userId,
      message: req.body.message,
      conversationId:conversation.id
    })
    res.status(201).send({
      msg: "upload successful",
    });
    

    then/catchを混同しないでください およびawaitawaitを使用する場合 すでに結果または例外が発生しています(try/catchを使用して処理できます) 。




    1. SQLServerでのOracleLinkedServerの作成と構成

    2. (IDではなく)インデックスでSQLiteの行を取得する方法

    3. MySQLでLimit句を改善する方法

    4. SQLPARTITIONBY句をいつどのように使用するか