Skip to content

Instantly share code, notes, and snippets.

@flaviodesousa
Last active February 23, 2016 11:31
Show Gist options
  • Save flaviodesousa/1465625173202fda563e to your computer and use it in GitHub Desktop.
Save flaviodesousa/1465625173202fda563e to your computer and use it in GitHub Desktop.
Bookshelf js fetchAll withRelated option returns empty relation object - attempt to reproduce
{
"name": "bookshelf-relations",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"bookshelf": "^0.9.1",
"knex": "^0.9.0",
"sqlite3": "^3.1.1"
}
}
➜ bookshelf-relations rm data.sqlite3
rm: remove regular file ‘data.sqlite3’? y
➜ bookshelf-relations node
> var knex = require('knex')({client:'sqlite3',connection:{filename: 'data.sqlite3'}});
undefined
> var bookshelf = require('bookshelf')(knex);
undefined
> var up = function(knex, Promise) {
... return knex.schema.createTable("backfire", function(table) {
..... table.increments("id").primary();
..... table.string("response").notNullable();
..... table.string("created_by").notNullable();
..... table.timestamps();
..... }).then(function(){
..... return knex.schema.createTable("backfireTrigger", function(table) {
....... table.increments("id").primary();
....... table.string("trigger").notNullable();
....... table.integer("backfire_id").unsigned().notNullable().references("id").inTable("backfire");
....... table.string("created_by").notNullable();
....... table.timestamps();
....... });
..... });
... };
undefined
> up(knex);
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_progressHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_settledValue: undefined }
> var Backfire = bookshelf.Model.extend({
... tableName: 'backfire',
... backfireTriggers: function() {
..... return this.hasMany(BackfireTrigger);
..... }
... });
undefined
>
> var BackfireTrigger = bookshelf.Model.extend({
... tableName: 'backfireTrigger',
... backfire: function() {
..... return this.belongsTo(Backfire);
..... }
... });
undefined
> var bf1, bf2;
undefined
> new Backfire({response: 'twist', created_by: 'twister'}).
... save().
... then(function(bf) {
... bf1 = bf.id;
... return new Backfire({response: 'shout', created_by: 'shouter'}).
... save();
... }).
... then(function(bf) {
... bf2 = bf.id;
... return new BackfireTrigger({trigger: 'death', backfire_id: bf1, created_by: 'dead'}).
... save();
... }).
... then(function() {
... return new BackfireTrigger({trigger: 'birth', backfire_id: bf2, created_by: 'mother'}).
... save();
... }).
... then(function() {
... return new BackfireTrigger({trigger: 'fall', backfire_id: bf2, created_by: 'faller'}).
... save();
... }).
... then(function() {
... return new BackfireTrigger({trigger: 'attack', backfire_id: bf2, created_by: 'attacker'}).
... save();
... }).
... then(function() {
... return BackfireTrigger.
... fetchAll({withRelated: ['backfire']}).
... then(function(result) {
..... console.log(result.toJSON());
..... });
... });
Promise {
_bitField: 131072,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_progressHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_settledValue: undefined,
_boundTo:
ModelBase {
attributes: { response: 'twist', created_by: 'twister' },
_previousAttributes: {},
changed: { response: 'twist', created_by: 'twister' },
relations: {},
cid: 'c1' } }
> [ { id: 1,
trigger: 'death',
backfire_id: 1,
created_by: 'dead',
created_at: null,
updated_at: null,
backfire:
{ id: 1,
response: 'twist',
created_by: 'twister',
created_at: null,
updated_at: null } },
{ id: 2,
trigger: 'birth',
backfire_id: 2,
created_by: 'mother',
created_at: null,
updated_at: null,
backfire:
{ id: 2,
response: 'shout',
created_by: 'shouter',
created_at: null,
updated_at: null } },
{ id: 3,
trigger: 'fall',
backfire_id: 2,
created_by: 'faller',
created_at: null,
updated_at: null,
backfire:
{ id: 2,
response: 'shout',
created_by: 'shouter',
created_at: null,
updated_at: null } },
{ id: 4,
trigger: 'attack',
backfire_id: 2,
created_by: 'attacker',
created_at: null,
updated_at: null,
backfire:
{ id: 2,
response: 'shout',
created_by: 'shouter',
created_at: null,
updated_at: null } } ]
var knex = require('knex')({client:'sqlite3',connection:{filename: 'data.sqlite3'}});
var bookshelf = require('bookshelf')(knex);
var up = function(knex, Promise) {
return knex.schema.createTable("backfire", function(table) {
table.increments("id").primary();
table.string("response").notNullable();
table.string("created_by").notNullable();
table.timestamps();
}).then(function(){
return knex.schema.createTable("backfireTrigger", function(table) {
table.increments("id").primary();
table.string("trigger").notNullable();
table.integer("backfire_id").unsigned().notNullable().references("id").inTable("backfire");
table.string("created_by").notNullable();
table.timestamps();
});
});
};
up(knex);
var Backfire = bookshelf.Model.extend({
tableName: 'backfire',
backfireTriggers: function() {
return this.hasMany(BackfireTrigger);
}
});
var BackfireTrigger = bookshelf.Model.extend({
tableName: 'backfireTrigger',
backfire: function() {
return this.belongsTo(Backfire);
}
});
var bf1, bf2;
new Backfire({response: 'twist', created_by: 'twister'}).
save().
then(function(bf) {
bf1 = bf.id;
return new Backfire({response: 'shout', created_by: 'shouter'}).
save();
}).
then(function(bf) {
bf2 = bf.id;
return new BackfireTrigger({trigger: 'death', backfire_id: bf1, created_by: 'dead'}).
save();
}).
then(function() {
return new BackfireTrigger({trigger: 'birth', backfire_id: bf2, created_by: 'mother'}).
save();
}).
then(function() {
return new BackfireTrigger({trigger: 'fall', backfire_id: bf2, created_by: 'faller'}).
save();
}).
then(function() {
return new BackfireTrigger({trigger: 'attack', backfire_id: bf2, created_by: 'attacker'}).
save();
}).
then(function() {
return BackfireTrigger.
fetchAll({withRelated: ['backfire']}).
then(function(result) {
console.log(result.toJSON());
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment