[英]Sequelize: use field created in sequelize.literal in where clause
[英]Sequelize Access parent table's field on where clause
我有Ad
, Banner
, Redirect
和Script
模型。 Ad
是父表。
廣告模型
import UID from '../util/uid';
export default (sequelize, DataTypes) => {
const Ad = sequelize.define('Ad',
{
uid: {
type: DataTypes.STRING(40),
allowNull: false,
unique: true
},
name: {
type: DataTypes.STRING(15),
allowNull: false
},
type: {
type: DataTypes.STRING(15),
allowNull: false
}
});
Ad.hook('beforeValidate', (ad, options) => ad.uid = UID.generate());
return Ad;
};
橫幅廣告模型
export default (sequelize, DataTypes) => {
const Banner = sequelize.define('Banner',
{
outcome: {
type: DataTypes.STRING(120),
allowNull: false
},
image: {
type: DataTypes.STRING(120),
allowNull: false
}
},
{
classMethods: {
associate: (models) => {
Banner.belongsTo(models.Ad);
Banner.hasMany(models.Format);
}
}
});
return Banner;
};
因此,當我搜索橫幅時,我需要訪問Ad.uid
才能檢索所有數據: https://myapp.doamin.com/ads/uid/dh49mmx02?type=banner
: Ad.uid
。
廣告API
router.get('/:uid', (request, response) => {
const adType = request.query.type;
let service = null;
switch(adType) {
case 'banner':
service = bannerService; break;
...
}
service.findOne(request.params.uid, (ad) => {
if(!ad) {
response.json({eror: true, message: 'Ad not found'});
} else {
response.json(ad);
}
});
});
標語服務
export default class BannerService {
find(qty, cb) {
Banner.findAll({offset: qty, limit: 10})
.then((banners) => cb(banners));
}
findOne(uid, cb) {
Banner.find({where: {'Ad.uid': uid}, include: [Ad, Format]})
.then((banner) => cb(banner));
}
...
}
當我嘗試獲取橫幅時,拋出此錯誤: Banner.Ad.uid column not exist
。 我也嘗試了$Ad.uid$
但是它拋出An entry for table Ad is missing in from clause
。
哪個是正確的方法?
首先,我認為您還應該通過添加與Ad.hasMany(models.Banner);
的associate
函數來指定從廣告到橫幅的associate
Ad.hasMany(models.Banner);
。
至於查詢,Sequelize實際上允許您在include
添加一個where語句。
findOne(uid, cb) {
Banner.find({include: [
{model: Ad, where: {uid: uid}},
Format
]}).then((banner) => cb(banner));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.