質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1210閲覧

Node.js, sequelizeから主キーを抽出できない

velonica74

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/15 14:09

編集2021/07/15 14:19

sequelizeからfindメソッドを用いても、主キーだけ抽出することができません。
多対多の中間テーブルで、詳細は以下のようになっております。

mysql

1mysql> SELECT * FROM `database_development`.`UserItems`; 2+----+--------+--------+-------+---------------------+---------------------+ 3| id | userId | itemId | isSet | createdAt | updatedAt | 4+----+--------+--------+-------+---------------------+---------------------+ 5| 1 | 1 | 1 | 1 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 6| 2 | 1 | 2 | 0 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 7| 3 | 1 | 2 | 0 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 8| 4 | 1 | 3 | 1 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 9| 5 | 1 | 1 | 0 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 10| 6 | 2 | 2 | 1 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 11| 7 | 2 | 3 | 1 | 2021-07-15 13:21:56 | 2021-07-15 13:21:56 | 12+----+--------+--------+-------+---------------------+---------------------+

ルーティングファイルにて上記データベースへのfindAllを行ったところ、

js

1router.get('/sell', (req, res, next) => { 2 if (check(req, res)){ return }; 3 db.UserItem.findAll({ 4 where: { 5 userId: req.session.login.id 6 }, 7 include: [{ 8 model: db.Item, 9 required: true 10 }] 11 }).then(itms => { 12 console.log(itms);

console

1[ 2 UserItem { 3 dataValues: { 4 userId: 1, 5 itemId: 1, 6 isSet: true, 7 createdAt: 2021-07-15T13:21:30.000Z, 8 updatedAt: 2021-07-15T13:21:30.000Z, 9 Item: [Item] 10 }, 11....略....

となり、idのみ抽出することができませんでした。一方で、本プロジェクトのUserモデルにおいてはfindによって主キーを含めたレコード全体の抽出ができています。

懸念点としては、このUserItemモデルのidをpkとして後から追加したことで、それがどこかで影響しているのではないか、と考えています。
追加の実施については、マイグレーションファイルにidの項目を付け加え、マイグレーションし直し、seedを与えることで実現しました。

js

1// migration file 2'use strict'; 3module.exports = { 4 up: async (queryInterface, Sequelize) => { 5 await queryInterface.createTable('UserItems', { 6 id: { 7 allowNull: false, 8 autoIncrement: true, 9 primaryKey: true, 10 type: Sequelize.INTEGER 11 }, 12 userId: { 13 allowNull: false, 14 type: Sequelize.INTEGER 15 }, 16 itemId: { 17 allowNull: false, 18 type: Sequelize.INTEGER 19 }, 20 isSet: { 21 allowNull: false, 22 type: Sequelize.BOOLEAN 23 }, 24 createdAt: { 25 allowNull: false, 26 type: Sequelize.DATE 27 }, 28 updatedAt: { 29 allowNull: false, 30 type: Sequelize.DATE 31 } 32 }); 33 }, 34 down: async (queryInterface, Sequelize) => { 35 await queryInterface.dropTable('UserItems'); 36 } 37};

また中間テーブルUserItemのモデル定義についても以下に記載させていただきます。

js

1'use strict'; 2const { 3 Model 4} = require('sequelize'); 5module.exports = (sequelize, DataTypes) => { 6 class UserItem extends Model {}; 7 UserItem.init({ 8 userId: DataTypes.INTEGER, 9 itemId: DataTypes.INTEGER, 10 isSet: DataTypes.BOOLEAN 11 }, { 12 sequelize, 13 modelName: 'UserItem', 14 }); 15 UserItem.associate = function(models) { 16 UserItem.belongsTo(models.User, { foreignKey: 'userId' }); 17 UserItem.belongsTo(models.Item, { foreignKey: 'itemId' }); 18 }; 19 return UserItem; 20};

初心者質問で恐縮ですが、何卒お力添えいただけますと幸いです。よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

UserItemのモデル定義

js

1'use strict'; 2const { INTEGER } = require('sequelize'); 3const { 4 Model 5} = require('sequelize'); 6module.exports = (sequelize, DataTypes) => { 7 class UserItem extends Model {}; 8 UserItem.init({ 9 id: { 10 type: DataTypes.INTEGER, 11 primaryKey: true 12 }, 13 userId: DataTypes.INTEGER, 14 itemId: DataTypes.INTEGER, 15 isSet: DataTypes.BOOLEAN 16 }, { 17 sequelize, 18 modelName: 'UserItem', 19 }); 20 UserItem.associate = function(models) { 21 UserItem.belongsTo(models.User, { foreignKey: 'userId' }); 22 UserItem.belongsTo(models.Item, { foreignKey: 'itemId' }); 23 }; 24 return UserItem; 25};

マイグレーションファイル

js

1'use strict'; 2module.exports = { 3 up: async (queryInterface, Sequelize) => { 4 await queryInterface.createTable('UserItems', { 5 id: { 6 allowNull: false, 7 autoIncrement: true, 8 primaryKey: true, 9 type: Sequelize.INTEGER 10 }, 11 userId: { 12 allowNull: false, 13 type: Sequelize.INTEGER 14 }, 15 itemId: { 16 allowNull: false, 17 type: Sequelize.INTEGER 18 }, 19 isSet: { 20 allowNull: false, 21 type: Sequelize.BOOLEAN 22 }, 23 createdAt: { 24 allowNull: false, 25 type: Sequelize.DATE 26 }, 27 updatedAt: { 28 allowNull: false, 29 type: Sequelize.DATE 30 } 31 }); 32 }, 33 down: async (queryInterface, Sequelize) => { 34 await queryInterface.dropTable('UserItems'); 35 } 36};

とidの記述を追加することで解決できました。

投稿2021/07/19 04:41

velonica74

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問