2015-07-28 10 views
10

मैं जॉइनिंग टेबलक्या एसोसिएशन के साथ एसोसिएशन टेबल में विशेषताओं से एक क्वेरी फ़िल्टर करना संभव है?

में मेरी क्वेरी को फ़िल्टर करने का प्रयास कर रहा हूं। मेरे पास 2 टेबल शहर और श्रेणियां हैं जिन्हें मैं तीसरी तालिका CityCategory के माध्यम से जोड़ रहा हूं। विचार CityCategory पर किसी शहर से संबंधित श्रेणियां प्राप्त करना है। year एक विशिष्ट पूर्णांक है।

module.exports = function(sequelize, DataTypes) { 
    var CityCategory = sequelize.define('CityCategory', { 
     year: { 
      type: DataTypes.INTEGER, 
      allowNull: false, 
      validate: { 
       notNull: true 
      } 
     } 
    }, { 
     indexes: [{ 
      unique: true, 
      fields: ['CityId', 'CategoryId', 'year'] 
     }] 
    }); 

    return CityCategory; 
}; 

City.belongsToMany(models.Category, { 
        through: { 
         model: models.CityCategory 
        } 
       }); 

Category.belongsToMany(models.City, { 
        through: { 
         model: models.CityCategory 
        } 
       }); 

यह क्वेरी मैं वर्तमान में कर रहा हूँ है असफल का उपयोग कर:

City.find({ 
     where: {id: req.params.id}, 
     attributes: ['id', 'name'], 
     include: [{ 
      model: Category, 
      where: {year: 2015}, 
      attributes: ['id', 'name', 'year'] 
     }] 
    }) 
    .then(function(city) { 
     ... 
    }); 

दुर्भाग्य से मुझे यकीन है कि कैसे उपयोग करने के लिए sequelize बताने के लिए नहीं कर रहा हूँ

यह कैसे मैं संघों निर्दिष्ट है सिटी मॉडल की सालाना विशेषता श्रेणी मॉडल में 'वर्ष' नामक एक विशेषता की तलाश में ...

Unhandled rejection SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'Category.CityCategory.year' in 'where clause' 

क्या यह संभव है या मुझे जाना होगा और मैन्युअल रूप से मेरी कस्टम क्वेरी लिखनी होगी?

अग्रिम में बहुत धन्यवाद!

संपादित

मैं एक छोटे से अधिक के आसपास खेल रहा है और एक समाधान मिल गया! यह थोड़ा गन्दा लगता है इसलिए मुझे यकीन है कि एक बेहतर तरीका होना चाहिए।

City.find({ 
    where: {id: req.params.id}, 
    attributes: ['id', 'name'], 
    include: [{ 
     model: Category, 
     where: [ 
     '`Categories.CityCategory`.`year` = 2015' 
     ], 
     attributes: ['id', 'name', 'year'] 
    }] 
    }) 
    .then(function(city) { 
    ... 
    }); 

उत्तर

11

जब के माध्यम से तालिका में जानना चाहते हैं, तो आप through.where

include: [{ 
    model: Category, 
    through: { where: {year: 2015}}, 
    attributes: ['id'] 
}] 

का उपयोग करना चाहिए तुम चाहते हो सकता है required: true जोड़ने के लिए चालू करने के लिए एक आंतरिक

+0

यह बहुत बेहतर है, बहुत बहुत धन्यवाद जनवरी! – pire

+0

मॉडल के माध्यम से कोई नहीं है तो क्या होगा? – user3631341

+0

@ user3631341 आपका क्या मतलब है - यह प्रश्न एसोसिएशन टेबल (मॉडल के माध्यम से उर्फ) पर फ़िल्टरिंग के बारे में है –

1

शामिल होने के लिए शामिल Sequelize v3 के लिए यह प्रतीत होता है वाक्य रचना है आपके सुझाव के करीब, यह है:

include: [{ 
    model: Category, 
    where: {year: 2015}, 
    attributes: ['id'] 
}] 
संबंधित मुद्दे