【问题标题】:Sequelize Access parent table's field on where clause在 where 子句上 Sequelize Access 父表的字段
【发布时间】:2016-07-05 16:45:33
【问题描述】:

我有 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

广告 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

这样做的正确方法是什么?

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    首先,我认为您还应该通过添加associate 函数和Ad.hasMany(models.Banner); 来指定从广告到横幅的关联。

    至于查询,Sequelize 实际上允许您在 include 中添加 where 语句

    findOne(uid, cb) {
      Banner.find({include: [
        {model: Ad, where: {uid: uid}},
        Format
      ]}).then((banner) => cb(banner));
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-08
      • 2017-07-26
      • 2021-06-16
      • 2023-03-03
      • 2016-07-09
      • 2019-12-23
      • 2015-05-25
      • 2019-12-23
      • 1970-01-01
      相关资源
      最近更新 更多