簡體   English   中英

在where子句中對Access父表的字段進行排序

[英]Sequelize Access parent table's field on where clause

我有AdBannerRedirectScript模型。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM