2

我刚刚发现 Sequelize 是一个很好的 ORM 框架,可以在我的 node + MySQL webapp 中使用。但是当我设计我的数据库表时,我对 Sequelize 关联感到非常困惑。

只需将 webapp 中的用户和系统通知视为一个非常简单的案例:

  • 该网站有很多用户
  • 该网站会向部分或所有用户发送通知,并且相同的通知只是保存为一条记录
  • 用户可以知道他/她收到的任何通知是否已阅读(按阅读日期)

然后我按预期设计了3个表:

  1. User: id,name
  2. Notification: id, title, content,sendAt
  3. Notify: id, UserId(作为接收者), NotificationId,readAt

我可以通过 Sequelize简单地定义User和建模。Notification但我只是不知道如何使用关联来Notify通过外键UserIdNotificationId.

我曾尝试使用hasOne这样的关联:

Notify.hasOne(User);
Notify.hasOne(Notification);

然后在两个表中都有一个NotifyId列。这不是我所期望的。也许我认为使用关联的方式错误,所以我想知道如何正确使用它?UserNotification

此外,如果我想获得 JSON 格式的结果:

[
    {id: 123, user: [Object some user], notification: [Object some notification], readAt: null},
    {id: 124, user: [Object another user], notification: [Object some notification], readAt: "Mon Oct 29 2012 20:44:54 GMT+0800"}
]

如何find像以前使用的 SQL 一样只使用一次方法查询:

SELECT
    Notify.id as 'Notify.id',
    User.name as 'User.name',
    Notification.title as 'Notification.title',
    Notification.sendAt as 'Notification.sendAt',
    Notify.readAt as 'Notify.readAt'
FROM User, Notification, Notify
WHERE
    Notify.UserId = User.id AND
    Notify.NotificationId = Notification.id;
4

1 回答 1

3

我找到了正确的方法。我意识到我的 Notify 表是一个完整的表,因为它包含一readAt列。所以关联应该定义为:

Notification.hasMany(db.Notify);
User.hasMany(db.Notify);

然后一切都好起来了。

第二个问题find也解决了。像这样使用:

Notify.findAll({
    include: ['User', 'Notification']
}).success(function (notify) {
    console.log(notify.user);
    console.log(notify.notification);
});
于 2012-12-21T09:15:54.713 回答