1. ホーム
  2. node.js

[解決済み] フィールドリスト」の不明な列 '*.createdAt' を順番に処理する。

2022-07-31 18:05:17

質問

フィールドリスト」に不明なカラム 'userDetails.createdAt' が表示されます。 アソシエーションでフェッチしようとすると

使用方法 findAll を使うとうまくいきます。

私のコードは以下の通りです。

var userDetails = sequelize.define('userDetails', {
    userId :Sequelize.INTEGER,
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
    birthday : Sequelize.DATE
});

var user = sequelize.define('user', {
    email: Sequelize.STRING,
    password: Sequelize.STRING
});

user.hasOne(userDetails, {foreignKey: 'userId'});

user.findAll({include: [userDetails] }).success(function(user) {
    console.log(user)
});

どのように解決するのですか?

sequelizeでタイムスタンプを有効にしているが、DBの実際のテーブル定義にタイムスタンプのカラムが含まれていないことが原因だと思われます。

user.findを実行すると、次のようになります。 SELECT user.* で、実際に持っているカラムだけを取ります。しかし、結合すると、結合されたテーブルの各カラムはエイリアスになり、次のようなクエリが作成されます。

SELECT `users`.*, `userDetails`.`userId` AS `userDetails.userId`,`userDetails`.`firstName` AS `userDetails.firstName`,`userDetails`.`lastName` AS `userDetails.lastName`, `userDetails`.`birthday` AS `userDetails.birthday`, `userDetails`.`id` AS `userDetails.id`, `userDetails`.`createdAt` AS `userDetails.createdAt`, `userDetails`.`updatedAt` AS `userDetails.updatedAt` FROM `users` LEFT OUTER JOIN `userDetails` AS `userDetails` ON `users`.`id` = `userDetails`.`userId`;

修正方法としては、userDetailsモデルのどちらかでタイムスタンプを無効化することです。

var userDetails = sequelize.define('userDetails', {
    userId :Sequelize.INTEGER,
    firstName : Sequelize.STRING,
    lastName : Sequelize.STRING,
    birthday : Sequelize.DATE
}, {
    timestamps: false
});

または全モデルに対して

var sequelize = new Sequelize('sequelize_test', 'root', null, {
    host: "127.0.0.1",
    dialect: 'mysql',
    define: {
        timestamps: false
    }
});