関連付けで取得しようとすると、「フィールドリスト」に「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
}
});
プロジェクトをlaravelからfeatherjsに移行する際に同じエラーが発生しました。テーブルの列名はcreatedat、updatedatではなくcreated_at、updated_atです。
const users = sequelize.define('users', {
id: {
type: Sequelize.INTEGER,
primaryKey: true
},
createdAt: {
field: 'created_at',
type: Sequelize.DATE,
},
updatedAt: {
field: 'updated_at',
type: Sequelize.DATE,
},
..
..
..
..
私は同じエラーを受け取りました、2つの解決策:
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'primary key', `name` varchar(30) DEFAULT NULL COMMENT 'user name', `created_at` datetime DEFAULT NULL COMMENT 'created time', `updated_at` datetime DEFAULT NULL COMMENT 'updated time', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='user';
const Proje
ct = sequelize.define('project', {
title: Sequelize.STRING,
description: Sequelize.TEXT
},{
timestamps: false
})