2014-08-30 6 views
1

Я использую TypScript, NodeJS и sequelize-auto-ts для генерации модели. Две модели, где я хочу разместить запрос include с поиском, дают мне неправильный результат, который, в свою очередь, вызван неправильным запросом. вот две модели, о которых идет речь;Sequelize генерирует неверный запрос? sequelize-auto-ts и sequelize

rewardcodes = <types.rewardcodesModel> sequelize.define<types.rewardcodeInstance, types.rewardcodePojo>('rewardcodes', { 
    'rewardid': { type: 'number', primaryKey: true, autoIncrement: true }, 
    'code':'string', 
    'amount':'string' 
    }, 
    { 
     timestamps: false, 
     classMethods: { 
      getrewardcode:(rewardcode:types.rewardcodePojo) => { 
       var where:{[key:string]:any} = {}; 
       if (rewardcode['rewardid'] !== undefined) { where['rewardid'] = rewardcode['rewardid']} 
       if (rewardcode['code'] !== undefined) { where['code'] = rewardcode['code']} 
       if (rewardcode['amount'] !== undefined) { where['amount'] = rewardcode['amount']} 
       return this.find({where: where}); 
      } 
     } 
    }); 

и

userfreecredits = <types.userfreecreditsModel> sequelize.define<types.userfreecreditInstance, types.userfreecreditPojo>('userfreecredits', { 
    'id': { type: 'number', primaryKey: true, autoIncrement: true }, 
    'userid': { type: 'number', references:user }, 
    'rewardid': {type: 'number',references: rewardcodes}, 
    'isexpired':'Buffer', 
    'isused':'Buffer', 
    'isactive':'Buffer', 
    'expireydate':'Date' 
    }, 
    { 
     timestamps: false, 
     classMethods: { 
      getuserfreecredit:(userfreecredit:types.userfreecreditPojo) => { 
       var where:{[key:string]:any} = {}; 
       if (userfreecredit['id'] !== undefined) { where['id'] = userfreecredit['id']} 
       if (userfreecredit['userid'] !== undefined) { where['userid'] = userfreecredit['userid']} 
       if (userfreecredit['rewardid'] !== undefined) { where['rewardid'] = userfreecredit['rewardid']} 
       if (userfreecredit['isexpired'] !== undefined) { where['isexpired'] = userfreecredit['isexpired']} 
       if (userfreecredit['isused'] !== undefined) { where['isused'] = userfreecredit['isused']} 
       if (userfreecredit['isactive'] !== undefined) { where['isactive'] = userfreecredit['isactive']} 
       if (userfreecredit['expireydate'] !== undefined) { where['expireydate'] = userfreecredit['expireydate']} 
       return this.find({where: where}); 
      } 
     } 
    }); 

и дб вызов Я делаю это следующим образом;

var association = <sequelize.AssociationOptions>{}; 
    association.foreignKey = "rewardid"; 
    models.userfreecredits.hasOne(models.rewardcodes,association); 
    models.rewardcodes.hasMany(models.userfreecredits); 

    var findOptions = <sequelize.FindOptions>{}; 
    findOptions.where = { userid: userId, isexpired: false, isused: false, isactive: true, expireydate: { gte: new Date() } }; 
    findOptions.include = models.rewardcodes; 

    return models.userfreecredits.find(findOptions).complete((err: Error, credits: types.userfreecreditInstance) => { 
     return credits; 
    }); 

Но сгенерированный запрос сверху неправильно и говорит userfreecredit.id = rewardcodes.id

SELECT `userfreecredits`.*, `rewardcode`.`rewardid` AS `rewardcode.rewardid`, 
`rewardcode`.`code` AS `rewardcode.code`, `rewardcode`.`amount` AS 
    `rewardcode.amount` FROM `userfreecredits` LEFT OUTER JOIN `rewardcodes` AS 
     `rewardcode` ON `userfreecredits`.`id` = `rewardcode`.`rewardid` 
     WHERE `userfreecredits`.`userid`='1' AND `userfreecredits`.`isexpired`=false 
     AND `userfreecredits`.`isused`=false AND `userfreecredits`.`isactive`=true 
     AND`userfreecredits`.`expireydate` >= '2014-08-29 21:49:08' LIMIT 1; 

Пожалуйста, помогите мне указывая на то, что я делаю неправильно или отсутствует.

+0

Так что я нашел мой ошибка вместо hasOne Мне пришлось использовать applyTo, и это сработало для справки. Документация дала мне какой-то смысл, но через некоторое время https://gist.github.com/sdepold/1757695 – Bilal

+0

Создайте ответ самостоятельно и примите его, затем можно увидеть из списка вопросов, что эта тема закрыта (и ответила) ... –

ответ

2

Так что я нашел свою ошибку вместо hasOne я должен был использовать belongsTo и worked.For ссылки на документацию http://sequelizejs.com/docs/latest дал мне какой-то смысл, но через некоторое время gist.github.com/sdepold/1757695

+0

Рад, что вы нашли решение. Я не понимал, что кто-то еще даже использовал 'sequelize-auto-ts'. Рад, что вы сочли это полезным. –

+0

Спасибо @SamuelNeff Я также написал сообщение в блоге по этому поводу http://bilalhasankhan.blogspot.in/2014/11/typescript-and-repository-pattern.html – Bilal

Смежные вопросы