2015-05-05 17 views
7

Ho due modelli correlati, Catalog e ProductCategory. Quest'ultimo ha un PK composto, 'id, language_id'. Qui ci sono i modelli semplificati:Sequelize: Include.where filtering di un attributo 'parent' Model

var Catalog = sequelize.define("Catalog", { 
id: { 
    type: DataTypes.INTEGER, 
    primaryKey: true, 
    autoIncrement: true 
}, 
user_id: { 
    type: DataTypes.INTEGER, 
    allowNull: false 
}, 
product_category_id: { 
    type: DataTypes.STRING(7) 
}, 
language_id: { 
    type: DataTypes.INTEGER 
}, 
... more stuff ... 
} 

var ProductCategory = sequelize.define("ProductCategory", { 
id: { 
    type: DataTypes.STRING(7), 
    primaryKey: true 
}, 
language_id: { 
    type: DataTypes.INTEGER, 
    primaryKey: true 
}, 
... more stuff ... 
} 

Catalog.belongsTo(models.ProductCategory, {foreignKey: 'product_category_id'}); 

sto cercando di includere alcune informazioni da tavolo ProductCategory relative al Catalogo, ma solo quando le partite language_id.

In questo momento ricevo tutte le possibili corrispondenze da entrambe le tabelle. Questa è la query in questo momento:

Catalog.find({where: 
    {id: itemId}, 
    include: { 
     model: models.ProductCategory, 
     where: {language_id: /* Catalog.language_id */} 
    } 
}) 

C'è un modo per utilizzare un attributo dal catalogo per filtrare l'includere in cui entrambi i modelli hanno la stessa lingua?

A proposito, ho anche provato a cambiare il caluse dove, senza alcun consecuence:

where: {'ProductCategory.language_id': 'Catalog.language_id'} 

risposta

7

Sequelize fornisce un operatore in più per $col questo caso in modo da non dover usare sequelize.literal('...') (che è più un hack).

Nel tuo esempio l'uso sarebbe simile a questa:

Catalog.find({where: 
    {id: itemId}, 
    include: { 
     model: models.ProductCategory, 
     where: { 
      language_id: {$col: 'Catalog.language_id'} 
     } 
    } 
}) 
+0

Testato e funziona come un fascino, grazie per il miglioramento sul mio auto-anser. ;) –

2

Questo sembra questo il trucco:

where: {language_id: models.sequelize.literal('Catalog.language_id')} 
+0

dove ha fatto questo lavoro? usando 'sequelize.literal ('Sale.debt') rende questa cosa strana:' 'Payments' .quantity' =' val' = \ 'Sale.debt \' '' –

+1

@dan_rocha: Sostituire la parte interna ** dove * * nella query ** Catalog.find ** originariamente pubblicata. Se condividi ciò che stai cercando di fare, potrei essere in grado di aiutarti. L'output è davvero strano, ma funziona. –