2016-07-05 2 views
0

У меня есть Ad, Banner, Redirect и Script модели. Ad является родительской таблицей.Sequelize Доступ к полю родительской таблицы, где пункт

модель 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 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)); 
} 
Смежные вопросы