Populating multiple tables in sails waterline orm
Asked Answered
S

1

2

I am working on a sails applications which contains multiple(>2) tables which I need to join with the help of populate method e.g.

Category.js model

attributes: {
    CategoryID:{
        type:"integer",
        required:true,
        primaryKey:true,
        autoIncrement:true
    },
    SubCategories:{                  //REFERING TO SUB-CATEGORY TABLE
        collection:'SubCategory',
        via:'CategoryID'
    },
    CategoryName:{
        type:"string",
        required:true,
        maxLength:50
    }
  }

this is SubCategory.js model.

attributes: {
    id:{
        type:'integer',
        required:true,
        primaryKey:true,
        autoIncrement:true,
        maxLength:10,
        columnName:'SubCategoryID'
    },
    CategoryID:{
        model:'Category'                 //REFERING TO CATEGORY TABLE
    },
    ProductsOfCategory:{                  //REFERING TO PRODUCT TABLE
        collection:'Product',
        via:'SubCategoryID'
    },
    SubCategory:{
        type:"string",
        required:true,
        maxLength:50
    }
}

and Product.js model

attributes: {
    id: {
        type: 'integer',
        primaryKey: true,
        autoIncrement: true,
        maxLength: 10,
        columnName:'ProductID'
    },
    SubCategoryID: {
        model:'SubCategory'
    },
    ProductDetails:{
        collection:'ProductDetails',
        via:'ProductID'
    },
    ProductName: {
        type: "string",
        required: true,
        maxLength: 50
    }
}

and ProductDeatils.js model

attributes: {
    id: {
        type: 'integer',
        primaryKey: true,
        autoIncrement: true,
        maxLength: 10,
        columnName:'ProductDetailID'
    },
    ProductID:{
        model:'Product'
    },
    Size:{
        type:"string",
        required:true,
        maxLength:10
    },
    Color:{
        type:"string",
        required:true,
        maxLength:10
    }
}

On Populating, I am able to populate the category and sub-category of each category.

Category.find()
        .populate('SubCategories')
        .exec(function(err, categories){
            if (err) {
                console.log(err);
                return res.json(err);
            }
            console.log(categories);
            res.json(categories);
        })

How to populate the all above table in one go such that after final query we get all the above details in one json.

We get join of all above tables

that is category having all sub-categories, sub-category having all products and all product have product details in one json

Sonorant answered 13/1, 2016 at 15:16 Comment(1)
ashishkumar - did my answer assist you? Please can you mark as correct answer if you found it helpful. Have also linked to a (slightly dated but very similar) SOF question.Indiction
I
1

You ask a great question. There has been massive interest in getting nested populate feature into sails, literally tens of issue requests and PRs etc.

Take a look at some history here:

[FEATURE REQUEST] Recursively populate #308 - i was late to the party, making the request on October 29th 2014 as you'll see in the history.

As far as I know, most conversations eventually converged here (after a couple of years of Sails users requesting the feature):

Deep populate #1052 (the issue remains open as of writing 14 Jan 2016)

It is unclear from the state of that Issue where we are. The history of both links does suggest alternative workarounds others have used.

My hunch is that recursive populate is not supported out of the box.

What I did when using waterline model associations with SailsJS, was work with a package like async.js - use something like waterfall to explicitly populate the child relationships programmatically. You can combine doing this with overriding the default toJSON() of the models you invoke to add their relationships (which you have programmatically populated) to the JSON response. You could equally choose to use the built-in promises to achieve the same thing.

Found this (dated, 2014) SOF Question which offers more information.

Someone, do please correct me here if I have missed this feature addition in a recent Sails or Waterline version - couldn't find anything in the release notes for either project to say this was supported.

Indiction answered 14/1, 2016 at 1:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.