2

Sequelizeは、ノード+MySQLWebアプリで使用するのに適したORMフレームワークであることがわかりました。しかし、データベーステーブルを設計しているときに、Sequelizeアソシエーションについて非常に混乱しました。

Webアプリでのユーザーとシステムの通知を非常に単純なケースと考えてください。

  • このサイトには多くのユーザーがいます
  • サイトは一部またはすべてのユーザーに通知を送信し、同じ通知を1つのレコードとして保存するだけです
  • ユーザーは、受け取った通知が読まれているかどうかを知ることができます(読まれた日付までに)

次に、期待どおりに3つのテーブルを設計します。

  1. Useridname
  2. Notificationid、、、、title_ content_sendAt
  3. NotifyidUserId(受信者として)NotificationId、、readAt

Sequelizeで簡単に定義Userしてモデル化できます。しかし、外部キーとによって、関連Notification付けを使用して2つのテーブルに関連付ける方法がわかりません。NotifyUserIdNotificationId

私は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のように、メソッドクエリを1回だけ使用するにはどうすればよいですか。

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

その後、すべてがOKになりました。

の2番目の問題findも解決されました。このように使用してください:

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