Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop over rows after .fetchAll Bookshelf js + knex js?

I have a MySQL Database which I need to query from node.js

I am using bookshelf and knex for this.

I want to get the contents of a table - I have defined a table in my model.js file. I am attempting the query like this:

//select * from completedSentences;
Model.CompletedSentences.fetchAll().then(function (resData) {
        console.log(resData)
    })

I would like to know how to loop over resData because it should be multiple rows.

The output of the console looks like this: I dont see a list of rows I can loop over.. What am i missing?

CollectionBase {
  model:
   { [Function]
     NotFoundError: [Function: ErrorCtor],
     NoRowsUpdatedError: [Function: ErrorCtor],
     NoRowsDeletedError: [Function: ErrorCtor] },
  length: 1,
  models:
   [ ModelBase {
       attributes: [Object],
       _previousAttributes: [Object],
       changed: {},
       relations: {},
       cid: 'c4',
       id: 1 } ],
  _byId:
   { '1':
      ModelBase {
        attributes: [Object],
        _previousAttributes: [Object],
        changed: {},
        relations: {},
        cid: 'c4',
        id: 1 },
     c4:
      ModelBase {
        attributes: [Object],
        _previousAttributes: [Object],
        changed: {},
        relations: {},
        cid: 'c4',
        id: 1 } },
  _knex: null,
  _events: {},
  _eventsCount: 0 }
like image 521
A.D Avatar asked Nov 24 '15 23:11

A.D


4 Answers

I found the answer (the documentation is very cryptic, hope this helps others)

new Model.CompletedSentences().fetchAll().then(function (resData) {
        _.each(resData.models, function (model) { //I am looping over models using underscore, you can use any loop
            console.log(model.attributes)
        })

    })
like image 108
A.D Avatar answered Oct 23 '22 22:10

A.D


Model.CompletedSentences.fetchAll().then(function (resData) {
        console.log(resData.serialize())
    })

output is in json format

http://bookshelfjs.org/#Model-instance-serialize

like image 36
RalleSaid Avatar answered Oct 23 '22 21:10

RalleSaid


The Collection class has a set of lodash methods for this.

You can use collection.forEach this way:

new Model.CompletedSentences().fetchAll().then(function (completedSentences) {
        completedSentences.forEach(function (model) {
            console.log(model.attributes)
        })    
    })

Check out the docs, there are many other useful methods for Collection.

like image 7
pietrovismara Avatar answered Oct 23 '22 22:10

pietrovismara


If you dont want to use lodash, you can do this:

new Model.CompletedSentences().fetchAll().then(function (resData) {
    resData.models.forEach( function (model) { 
        console.log(model.get('attribute');
        console.log(model.related('sth').get('attribute');
    })

})
like image 3
Salar Avatar answered Oct 23 '22 22:10

Salar