使用javascript库Sequelize操作mysql数据库的时候,经常会用到【虚拟字段】的技巧。虚拟字段是指在模型实例上存在但不存储在数据库中的字段。这些字段可以用于在查询结果中添加计算属性或进行格式化。本文介绍几种在Sequelize的schema中使用虚拟字段的几种场景。
1. 返回全名
设置模型的代码
const User = sequelize.define('user', {
firstName: Sequelize.STRING,
lastName: Sequelize.STRING,
}, {
// 定义虚拟字段
virtualFields: ['fullName'],
// 定义虚拟字段的getter方法
getterMethods: {
fullName() {
return `${this.firstName} ${this.lastName}`;
},
},
});
// 使用虚拟字段
const user = await User.findByPk(1);
console.log(user.fullName); // 访问虚拟字段
上述例子中,通过定义虚拟字段fullName
和相应的getter方法,可以在查询结果中获取用户的完整姓名。
使用模型的代码
const Product = sequelize.define('product', {
price: Sequelize.FLOAT,
discount: Sequelize.FLOAT,
}, {
// 定义虚拟字段
virtualFields: ['discountedPrice'],
// 定义虚拟字段的getter方法
getterMethods: {
discountedPrice() {
// 根据折扣计算折后价
return this.price - (this.price * this.discount) / 100;
},
},
});
// 使用虚拟字段
const product = await Product.findByPk(1);
console.log(product.discountedPrice); // 访问虚拟字段
在这个例子中,通过虚拟字段discountedPrice
,可以方便地计算商品的折后价。
明白了,我会再为你提供更多典型的例子。请稍等片刻。
示例2: 使用虚拟字段生成URL
设置模型的代码
// models/Photo.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const Photo = sequelize.define('Photo', {
filename: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
virtualFields: ['url'],
getterMethods: {
url() {
return `https://example.com/photos/${this.filename}`;
},
},
});
module.exports = Photo;
使用模型的代码
// 示例代码
// ...
// 获取所有照片的URL
const photos = await Photo.findAll();
// 格式化结果,包括虚拟字段
const formattedPhotos = photos.map(photo => ({
id: photo.id,
filename: photo.filename,
url: photo.url, // 访问虚拟字段
}));
// 发送响应
res.json({ photos: formattedPhotos });
示例3: 使用虚拟字段处理金额转换
设置模型的代码
// models/Transaction.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const Transaction = sequelize.define('Transaction', {
amount: {
type: DataTypes.DECIMAL(10, 2),
allowNull: false,
},
currency: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
virtualFields: ['formattedAmount'],
getterMethods: {
formattedAmount() {
return `${this.amount.toFixed(2)} ${this.currency}`;
},
},
});
module.exports = Transaction;
使用模型的代码
// 示例代码
// ...
// 获取所有交易的格式化金额
const transactions = await Transaction.findAll();
// 格式化结果,包括虚拟字段
const formattedTransactions = transactions.map(transaction => ({
id: transaction.id,
amount: transaction.amount,
currency: transaction.currency,
formattedAmount: transaction.formattedAmount, // 访问虚拟字段
}));
// 发送响应
res.json({ transactions: formattedTransactions });
示例4: 使用虚拟字段处理权限控制
设置模型的代码
// models/User.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const User = sequelize.define('User', {
role: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
virtualFields: ['isAdmin'],
getterMethods: {
isAdmin() {
return this.role === 'admin';
},
},
});
module.exports = User;
使用模型的代码
// 示例代码
// ...
// 获取所有用户并检查是否为管理员
const users = await User.findAll();
// 格式化结果,包括虚拟字段
const formattedUsers = users.map(user => ({
id: user.id,
role: user.role,
isAdmin: user.isAdmin, // 访问虚拟字段
}));
// 发送响应
res.json({ users: formattedUsers });
示例5: 使用虚拟字段处理图片尺寸
设置模型的代码
// models/Image.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/database');
const Image = sequelize.define('Image', {
width: {
type: DataTypes.INTEGER,
allowNull: false,
},
height: {
type: DataTypes.INTEGER,
allowNull: false,
},
}, {
virtualFields: ['aspectRatio'],
getterMethods: {
aspectRatio() {
return this.width / this.height;
},
},
});
module.exports = Image;
使用模型的代码
// 示例代码
// ...
// 获取所有图片的宽高比
const images = await Image.findAll();
// 格式化结果,包括虚拟字段
const formattedImages = images.map(image => ({
id: image.id,
width: image.width,
height: image.height,
aspectRatio: image.aspectRatio, // 访问虚拟字段
}));
// 发送响应
res.json({ images: formattedImages });
通过本文介绍的以上五个典型示例,开发者可以更深入地了解如何使用Sequelize中的虚拟字段进行模型设置和使用。