Sequelizeは、ノード+MySQLWebアプリで使用するのに適したORMフレームワークであることがわかりました。しかし、データベーステーブルを設計しているときに、Sequelizeアソシエーションについて非常に混乱しました。
Webアプリでのユーザーとシステムの通知を非常に単純なケースと考えてください。
- このサイトには多くのユーザーがいます
- サイトは一部またはすべてのユーザーに通知を送信し、同じ通知を1つのレコードとして保存するだけです
- ユーザーは、受け取った通知が読まれているかどうかを知ることができます(読まれた日付までに)
次に、期待どおりに3つのテーブルを設計します。
User
:id
、name
Notification
:id
、、、、title
_content
_sendAt
Notify
:id
、UserId
(受信者として)NotificationId
、、readAt
Sequelizeで簡単に定義User
してモデル化できます。しかし、外部キーとによって、関連Notification
付けを使用して2つのテーブルに関連付ける方法がわかりません。Notify
UserId
NotificationId
私はhasOne
このような関連付けを使用しようとしました:
Notify.hasOne(User);
Notify.hasOne(Notification);
次に、とテーブルNotifyId
の両方に列があります。そして、これは私の期待どおりではありません。アソシエーションの使い方を間違えたので、正しく使う方法を知りたいですか?User
Notification
さらに、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;