sql >> Databáze >  >> RDS >> PostgreSQL

Sequelize, jak strukturovat chatovou část aplikace?

Všechny modely vypadají dobře. Problémy jsou s asociacemi.

Pokud definujete více než jednu asociaci mezi stejnými dvěma modely, měli byste uvést různé aliasy, abyste je od sebe v dotazech odlišili.

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'
});

Také je lepší definovat asociace stejným způsobem buď přímo po definici modelu, nebo statickou metodou jako associate . Druhý přístup je výhodnější, protože umožňuje definovat každý model v jeho vlastním modulu bez jakýchkoli křížových odkazů pomocí models parametr v associate metoda pro přístup k dalším modelům, které by měly být přidruženy k danému modelu.

Poslední poznámka:zkuste definovat přidružení, kde model na levé straně definice přidružení ve svém vlastním associate metoda.To znamená, že

models.Message.belongsTo(Conversations);

by měl být v Message associate modelu metoda:

Message.belongsTo(models.Conversations);

Tímto způsobem vždy víte, kde najdete všechna přidružení, která definují odkazy z určitého modelu na jiné modely.

AKTUALIZACE

Nalezenou nebo vytvořenou konverzaci byste měli uložit do proměnné, abyste ji mohli použít při vytváření zprávy:

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",
});

Nesnažte se zaměňovat then/catch a await . Pokud použijete await již budete mít výsledek nebo výjimku (kterou můžete zpracovat pomocí try/catch ).




  1. Jak vytvořit dotaz v Drupal 8

  2. Jaké nejdelší možné celosvětové telefonní číslo bych měl zvážit v SQL varchar(length) for phone

  3. Vyhledejte matici pro všechny obdélníky daných rozměrů (vyberte bloky sedadel)

  4. Změňte ovladač MySQL používaný Joomlou