ノードjsでsequelize ORMを使用しています。 2つのテーブルを結合して結果を取得していますが、その結果はテーブル名をプレフィックスとして返します。
var Sequelize = require('sequelize');
var sequelize = new Sequelize('test', 'root', '', {
// configuration
}
});
const db = {};
db.Sequelize = Sequelize;
db.sequelize = sequelize;
db.role = require('./../model/definitions/role')(sequelize, Sequelize);
db.admin = require('./../model/definitions/admin')(sequelize, Sequelize);
db.admin.findAll({
include: [{
model: db.role,
where:{status : 'Active'},
}],
raw: true
}).then(function(result) {
console.log(result);
}).catch(function(error) {
console.log(error);
}).done();
今私はこの結果を得ています:
[{
"id": 36,
"email": "[email protected]",
"username": "test",
"status": "Active",
"role.role_id": 1,
"role.role_name": "Admin"
}]
しかし、私はこの結果が必要です:
[{
"id": 36,
"email": "[email protected]",
"username": "test",
"status": "Active",
"role_id": 1,
"role_name": "Admin"
}]
したがって、列から接頭辞テーブル名「ロール」を削除する方法。 「role_id」または「role_name」のみが必要ですが、「role.role_id」、「role.role_name」のようなこのタイプのデータは必要ありません。
これはうまくいくはずです
db.admin.findAll({
attributes: ['id', 'username', 'email', 'status', 'role.role_id', 'role.role_name'],
include: [{
model: db.role,
where:{status : 'Active'},
attributes: []
}],
raw: true
})
私はこれを見つけました ここ
最上位モデルを変更して、クエリで引き続き使用したい場合は、プロパティを除外して含めることもできます。
raw: true
db.admin.findAll({
include: [{
model: db.role,
where:{status : 'Active'},
attributes: ["role_id", "role_name"],
nested: false,
}],
attributes: {exclude: [],
include: ["role.role_id", "role.role_name"]},
raw: true
});
さらに、エイリアスも使用できます
db.admin.findAll({
include: [{
model: db.role,
where:{status : 'Active'},
attributes: [["role_id", "roleId"], ["role_name", "roleName"]]
}],
attributes: {exclude: [],
include: ["role.roleId", "role.roleName"]},
raw: true
});
raw: true ,
は、関連付けのあるデータを返すときに問題を引き起こします。これに対する解決策は次のとおりです。
削除:
raw: true
From:
db.admin.findAll({
include: [{
model: db.role,
where:{status : 'Active'},
}],
raw: true // <--------- Remove this
})