[解決済み] Node.jsでSequelizeを使用して結合クエリを作成する方法
2022-02-14 12:45:34
質問
私はsequelize ORMを使用しています。すべてが素晴らしく、きれいですが、それを
join
クエリを実行します。
私は2つのモデルを持っています:ユーザーと投稿。
var User = db.seq.define('User',{
username: { type: db.Sequelize.STRING},
email: { type: db.Sequelize.STRING},
password: { type: db.Sequelize.STRING},
sex : { type: db.Sequelize.INTEGER},
day_birth: { type: db.Sequelize.INTEGER},
month_birth: { type: db.Sequelize.INTEGER},
year_birth: { type: db.Sequelize.INTEGER}
});
User.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
var Post = db.seq.define("Post",{
body: { type: db.Sequelize.TEXT },
user_id: { type: db.Sequelize.INTEGER},
likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },
});
Post.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
ある投稿に対して、その投稿を行ったユーザーの情報を含むクエリを発行したい。生のクエリでは、私はこれを取得します。
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
私の質問は、SQLクエリの代わりにORMスタイルを使用するようにコードを変更するにはどうしたらよいかということです。
どのように解決するのですか?
User.hasMany(Post, {foreignKey: 'user_id'})
Post.belongsTo(User, {foreignKey: 'user_id'})
Post.find({ where: { ...}, include: [User]})
となります。
SELECT
`posts`.*,
`users`.`username` AS `users.username`, `users`.`email` AS `users.email`,
`users`.`password` AS `users.password`, `users`.`sex` AS `users.sex`,
`users`.`day_birth` AS `users.day_birth`,
`users`.`month_birth` AS `users.month_birth`,
`users`.`year_birth` AS `users.year_birth`, `users`.`id` AS `users.id`,
`users`.`createdAt` AS `users.createdAt`,
`users`.`updatedAt` AS `users.updatedAt`
FROM `posts`
LEFT OUTER JOIN `users` AS `users` ON `users`.`id` = `posts`.`user_id`;
上のクエリは、あなたが投稿したものと比べると少し複雑に見えるかもしれませんが、基本的に、usersテーブルのすべてのカラムをエイリアスにして、それらが返されたときに正しいモデルに配置され、postsモデルと混合されないようにしているだけです。
その他、2つのテーブルから選択するのではなく、JOINしていることに気がつくと思いますが、結果は同じはずです。
さらに読む
関連
-
[解決済み】mysql 外部キー制約が不正に形成されているエラー
-
[解決済み] MySQLで週単位でグループ化する方法は?
-
[解決済み] MySQLで日付のみのパラメータを使用してタイムスタンプの日付を比較する方法は?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】#1273 - 不明な照合順序:'utf8mb4_unicode_520_ci'
-
[解決済み】mysql.plugin テーブルを開くことができません。mysql_upgradeを実行して作成してください。
-
[解決済み】mysqld_safe UNIX ソケットファイル用のディレクトリ '/var/run/mysqld' が存在しません。
-
[解決済み] MySQLのforeachループ
-
[解決済み] MySQLで「一意のテーブル/エイリアスでない」場合
-
[解決済み] MySQL エラー: キーの長さがないキー指定
-
[解決済み] <TABLE> のテーブルストレージエンジンには、order by クエリでこのオプションがありません (ERROR 1031)。
-
[解決済み] Mysql: const テーブルを読み込んだ後、不可能な場所に気づいた。
-
[解決済み] MySQLの更新datetimeフィールド
-
[解決済み] MySQLのカラムを並べ替えるには?