on models have created , updated foreign key columns link user model. when query database using findall() example, include them user's username , other details returned results - exclude foreign key columns result @ makes no sense returning created object includes id , and createdbyid node it's duplicate data
"createdbyid": "21499bb6-4476-11e6-beb8-9e71128cae77", "createdby": { "id": "21499bb6-4476-11e6-beb8-9e71128cae77", "username": "mo.gusbi" }, "updatedbyid": "21499bb6-4476-11e6-beb8-9e71128cae77", "updatedby": { "id": "21499bb6-4476-11e6-beb8-9e71128cae77", "username": "mo.gusbi" }
so exclude createdbyid
, updatedbyid
attributes , works great, until have join other tables , include constraints (for pagination, cause subquery generated) looks createdbyid
, updatedbyid
columns excluded, causing sql error
sequelizedatabaseerror: sqlite_error: no such column: category.createdbyid
from generated query
select `category`.*, `children`.`id` `children.id`, `children`.`name` `children.name`, `createdby`.`id` `createdby.id`, `createdby`.`username` `createdby.username`, `updatedby`.`id` `updatedby.id`, `updatedby`.`username` `updatedby.username`, `deletedby`.`id` `deletedby.id`, `deletedby`.`username` `deletedby.username` ( select `category`.`id`, `category`.`name`, `category`.`parentid` `categories` `category` (`category`.`deletedat` null , `category`.`parentid` = null) limit 0, 10 ) `category` left outer join `categories` `children` on `category`.`id` = `children`.`parentid` , `children`.`deletedat` null left outer join `users` `createdby` on `category`.`createdbyid` = `createdby`.`id` , `createdby`.`deletedat` null left outer join `users` `updatedby` on `category`.`updatedbyid` = `updatedby`.`id` , `updatedby`.`deletedat` null left outer join `users` `deletedby` on `category`.`deletedbyid` = `deletedby`.`id` , `deletedby`.`deletedat` null ;
models
user = sequelize.define('user', { id: { type: datatypes.uuid, defaultvalue: datatypes.uuidv1, primarykey: true }, username: { type: datatypes.string, unique: true, allownull: false, validate: { notempty: true, is: regex.username } } }, { paranoid: true, classmethods: { associate: (models) => { user.belongsto(models.user, { foreignkey: 'createdbyid', as: 'createdby' }); user.belongsto(models.user, { foreignkey: 'updatedbyid', as: 'updatedby' }); user.belongsto(models.user, { foreignkey: 'deletedbyid', as: 'deletedby' }); } } }); category = sequelize.define('category', { id: { type: datatypes.uuid, defaultvalue: datatypes.uuidv1, primarykey: true }, name: { type: datatypes.string, allownull: false, validate: { notempty: true } } }, { indexes: [{ unique: true, fields: ['name', 'parentid'] }], paranoid: true, classmethods: { associate: (models: any) => { category.belongsto(models.user, { foreignkey: 'createdbyid', as: 'createdby' }); category.belongsto(models.user, { foreignkey: 'updatedbyid', as: 'updatedby' }); category.belongsto(models.user, { foreignkey: 'deletedbyid', as: 'deletedby' }); category.belongsto(models.category, { foreignkey: 'parentid', as: 'parent' }); category.hasmany(models.category, { foreignkey: 'parentid', as: 'children' }); } } });
query
category .findall({ attributes: [ 'id', 'name', 'parentid' ], where: { parentid: req.query.parentid }, include: [ { model: category, as: 'children', attributes: [ 'id', 'name' ] }, { model: user, as: 'createdby', attributes: [ 'id', 'username' ] }, { model: user, as: 'updatedby', attributes: [ 'id', 'username' ] }, { model: user, as: 'deletedby', attributes: [ 'id', 'username' ] } ], offset: 0, limit: 10 });
Comments
Post a Comment