2016-07-05 4 views
0

AdBannerRedirectおよびScriptモデルがあります。 Adは親テーブルです。Sequelize where節の親テーブルのフィールドへのアクセス

広告モデル

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を投げます。

これは正しい方法ですか?

答えて

0

まず、広告からバナーへの関連付けをassociateの機能にAd.hasMany(models.Banner);と追加して指定する必要があります。クエリについては

は、Sequelizeは実際にあなたがあなたのinclude

findOne(uid, cb) { 
    Banner.find({include: [ 
    {model: Ad, where: {uid: uid}}, 
    Format 
    ]}).then((banner) => cb(banner)); 
} 
内のどこのステートメントを追加することができます