Sequelize unable to model this relationship. X is not associated to Y - node.js

I have an Orders and Transactions table.
The id in Orders is to be used in the sellOrderId and buyOrderId columns
To model this in my Orders table I have
static associate({ Transactions }) {
Orders.hasMany(Transactions, { foreignKey: 'buyOrderId', sourceKey: 'id', as: 'buyTransactions' });
Orders.hasMany(Transactions, { foreignKey: 'sellOrderId', sourceKey: 'id', as: 'sellTransactions' });
}
In my Transactions model I have
static associate({ Orders }) {
Transactions.belongsTo(Orders, { foreignKey: 'id', targetKey: 'sellOrderId' });
Transactions.belongsTo(Orders, { foreignKey: 'id', targetKey: 'buyOrderId' });
}
I am attempting to get all Orders along with their associated transactions
I have tried many different queries but they all error out with the same error
EagerLoadingError [SequelizeEagerLoadingError]: Transaction is not associated to Orders!
Currently I have
const orders = await Order.findAll({
include: [
{
model: Transaction,
as: 'buyTransactions'
},
{
model: Transaction,
as: 'sellTransactions'
}
]
});
Regardless of if I have one or both same error, I can see in the database that the relationship exists, Im not sure why sequelize is not honoring this.

Related

Hi smart people, i have problem with (many to many) assocation with sequelize orm

i have problem with (many to many) assocation with sequelize orm
In my case i have 3 tables
products,
categories,
products_categories
and here are assocation in nodeJS
Product.belongsToMany(Categories, {
through: {
model: ProductsCategories,
as: 'products_categories',
},
foreignKey: "category_id"
})
Categories.belongsToMany(Product, {
through: {
model: ProductsCategories,
as: 'products_categories',
},
foreignKey: "product_id"
})
when i'm trying to fetch products with categories
sequelize not gives me back categories of the product
here are example
const products = await Product.findAll({
include:{
model:Categories,
nested:true,
through:{
model: ProductsCategories,
as: 'products_categories',
}
}
});
please help me understand where are my mistak ))
Please correct your model definitions as:
Product.belongsToMany(Categories, {
through: ProductsCategories,
as: 'products_categories',
foreignKey: "category_id"
})
Categories.belongsToMany(Product, {
through: ProductsCategories,
as: 'products_categories',
foreignKey: "product_id"
})
and findAll:
const products = await Product.findAll({
include:{
model:Categories,
as: 'products_categories'
}
});

many to many association in node js

here is link of my code . I am getting error in index.js in api-routes-index.js. getting error undefined map function
I guess here you have an error:
subcategories: products.subcategories.map(Subcategory => {
products is array, you can't get subcategories from array. Change it to this code:
subcategories: Product.subcategories.map(Subcategory => {
Many to many associations in sequilize.js
This will be helpful for you to solve the issue:
One product has many order
One order has many product
As a result of many to many we have junction table "orderproduct" which contains product_id and order_id.
// In product model
product.belongsToMany(order, {
through: 'orderproduct',
foreignKey: 'product_id'
});
// In order model
order.belongsToMany(product, {
through: 'orderproduct',
foreignKey: 'order_id'
});
// In oderproduct model
orderproduct.belongsTo(product, {
foreignKey: { name: 'product_id', allowNull: false }
});
orderproduct.belongsTo (order, {
foreignKey: { name: 'order_id', allowNull: false }
});
}

Sequelize: Joining Many to Many tag table with another table in postgresql

I am trying to setup many to many relationship in Sequelize for my Postgres tables using a tag (lookup) table. I was successful in setting up the relationship.
Now my lookup table, has an additional field which is a foreign key to another table. I want the data for that table to be included in my result set. This is where I am having hard time figuring out the syntax.
My models:
Models.user = sequelize.define('user', { //attributes});
Models.school = sequelize.define('school', { //attributes });
Models.role = sequelize.define('role', { //attributes });
Models.userSchools = sequelize.define('user_school', {
user_school_id: { type: Sequelize.INTEGER, primaryKey: true }
});
Models.user.belongsToMany(Models.school, { through: Models.userSchools, foreignKey: 'user_id', otherKey: 'school_id' });
Models.school.belongsToMany(Models.user, { through: Models.userSchools, foreignKey: 'school_id', otherKey: 'user_id' });
Models.userSchools.belongsTo(Models.role, { foreignKey: 'role_id' });
Working query: This query gives me all the users and their schools.
Models.user.findAll({
where: {
//condition
},
include: [Models.school]
})
Now I want to include the role for each schools. None of the below queries are working.
Models.user.findAll({
where: {
//conditions
},
include: [Models.schools, Models.role]
})
Above query is throwing an error saying role is not associated to user, which is expected.
Models.user.findAll({
where: {
//conditions
},
include: [Models.schools, {model: Models.userSchools, include: Models.role}]
})
This query is also throwing an error:
"userSchools is not associated to user".
Can any one help with syntax to how I can get the role information from the userSchools model?
Edit:
I have add a "through" condition which gets me the role_id but not the related role data.
Models.user.findAll({
where: {
//conditions
},
include: [{
model: Models.school,
as: 'schools',
through: {
attributes: ['role_id']
}
}]
})

get associations with belongsToMany in sequelize.js

I have a many-to-many relation between User and Device model, through a UserDevice join table:
device.belongsToMany(user, {
through: {
model: userDevice
},
foreignKey: "deviceId",
as: "customers"
});
user.belongsToMany(device, {
through: {
model: userDevice
},
foreignKey: "customerId",
as: "devices"
});
setCustomers: Sequelize.BelongsToManySetAssociationsMixin<UserInstance, string, UserDeviceAttribute>;
getCustomers: Sequelize.BelongsToManyGetAssociationsMixin<UserInstance>;
I can find devices and populate customers correctly with:
this.db.models.Device.findAll({
include: [{
model: User,
as: "customers"
}]
I can't figure out how I can populate customers in other scenarios, i.e. when I'm setting customers manually. Right now I'm trying something like:
return device.setCustomers(customers)
.then(() => {
return device.getCustomers();
})
.then((users) => {
device.setAttributes("customers", users);
return device;
});
but it's not working, setAttributes doesn't set customers field.
The answer is in the question. I found the bug today when encountered same issue.
https://github.com/sequelize/sequelize/blob/master/lib/model.js#L3483
setAttributes seems to be a reserved method for sequelize.

query using column from junction table

I have a Node entity with a many to many relationship with itself through Edge
var Node = db.define('nodes', {
'name': sequelize.STRING
});
var Edge = db.define('edges', {
'weight': sequelize.STRING
});
Node.hasMany(Node, { as: 'parents', foreignKey: 'parent_id', through: Edge});
Node.hasMany(Node, { as: 'children', foreignKey: 'child_id', through: Edge});
I want to get a nodes children which are created after a specific time using a query like the following
node.getChildren({
include: [Edge],
where: ['createdAt > ?', 1413000965754]
}).complete(function(err, children){
// ...
});
but I cant get it to work.

Resources