Search on a smart field with two joints
Last updated
Last updated
module.exports = (sequelize, DataTypes) => {
const { Sequelize } = sequelize;
const Orders = sequelize.define('orders', {
//...
}, {
tableName: 'orders',
underscored: true,
schema: process.env.DATABASE_SCHEMA,
});
Orders.associate = (models) => {
Orders.belongsTo(models.customers, {
foreignKey: {
name: 'customerId',
field: 'customer_id',
},
as: 'customer',
});
};
return Orders;
};module.exports = (sequelize, DataTypes) => {
const { Sequelize } = sequelize;
const Customers = sequelize.define('customers', {
...
}, {
tableName: 'customers',
underscored: true,
schema: process.env.DATABASE_SCHEMA,
});
Customers.associate = (models) => {
Customers.hasMany(models.orders, {
foreignKey: {
name: 'customerId',
field: 'customer_id',
},
as: 'orders',
});
Customers.hasOne(models.addresses, {
foreignKey: {
name: 'customerId',
field: 'customer_id',
},
as: 'addresses',
});
};
return Customers;
};module.exports = (sequelize, DataTypes) => {
const { Sequelize } = sequelize;
const Addresses = sequelize.define('addresses', {
addressLine1: {
type: DataTypes.STRING,
field: 'address_line_1',
},
...
}, {
tableName: 'addresses',
underscored: true,
schema: process.env.DATABASE_SCHEMA,
});
Addresses.associate = (models) => {
Addresses.belongsTo(models.customers, {
foreignKey: {
name: 'customerId',
field: 'customer_id',
},
as: 'customer',
});
};
return Addresses;
};const models = require('../models');
const { Op } = models.Sequelize;
collection('orders', {
fields: [{
field: 'delivery_address',
type: 'String',
reference: 'addresses.id',
// display the belongsTo Smart Relationship
get: function (order) {
return models.addresses
.findAll({
include: [{
model: models.customers,
as: 'customer',
where: { id: order.customerId },
include: [{
model: models.orders,
as: 'orders',
where: { ref: order.ref }
}]
}],
})
.then((addresses) => {
if (addresses) { return addresses[0]; }
});
},
// search on the belongsTo Smart Relationship
search(query, search) {
query.include.push({
model: models.customers,
as: 'customer',
include: [{
model: models.addresses,
as: 'addresses',
}],
});
query.where[Op.and][0][Op.or]
.push(models.sequelize.literal(`"customer->addresses"."address_line_1" ILIKE '%${search}%'`));
}
}],
});