Sequelize.js 简化左联接数据库Postgresql
我是feathersjs的新手,我被一个使用左连接的数据库查询卡住了。我读过续集,但我被卡住了。我有两张桌子 表1:Sequelize.js 简化左联接数据库Postgresql,sequelize.js,feathersjs,feathers-sequelize,feathers-hook,Sequelize.js,Feathersjs,Feathers Sequelize,Feathers Hook,我是feathersjs的新手,我被一个使用左连接的数据库查询卡住了。我读过续集,但我被卡住了。我有两张桌子 表1: Table "public.ek_jabatan" Column | Type | Modifiers ---------
Table "public.ek_jabatan"
Column | Type | Modifiers
----------------+--------------------------+-----------------------------------------------------------------
id_jabatan | integer | not null default nextval('ek_jabatan_id_jabatan_seq'::regclass)
id_instansi | integer | not null
nama_jabatan | character varying(100) | not null
urutan_jabatan | integer | not null
createdAt | timestamp with time zone |
updatedAt | timestamp with time zone |
Indexes:
"ek_jabatan_pkey" PRIMARY KEY, btree (id_jabatan)
Table "public.ek_instansi"
Column | Type | Modifiers
---------------+--------------------------+-------------------------------------------------------------------
id_instansi | integer | not null default nextval('ek_instansi_id_instansi_seq'::regclass)
nama_instansi | character varying(100) | not null
lokasi | character varying(200) | not null
createdAt | timestamp with time zone |
updatedAt | timestamp with time zone |
Indexes:
"ek_instansi_pkey" PRIMARY KEY, btree (id_instansi)
表2:
Table "public.ek_jabatan"
Column | Type | Modifiers
----------------+--------------------------+-----------------------------------------------------------------
id_jabatan | integer | not null default nextval('ek_jabatan_id_jabatan_seq'::regclass)
id_instansi | integer | not null
nama_jabatan | character varying(100) | not null
urutan_jabatan | integer | not null
createdAt | timestamp with time zone |
updatedAt | timestamp with time zone |
Indexes:
"ek_jabatan_pkey" PRIMARY KEY, btree (id_jabatan)
Table "public.ek_instansi"
Column | Type | Modifiers
---------------+--------------------------+-------------------------------------------------------------------
id_instansi | integer | not null default nextval('ek_instansi_id_instansi_seq'::regclass)
nama_instansi | character varying(100) | not null
lokasi | character varying(200) | not null
createdAt | timestamp with time zone |
updatedAt | timestamp with time zone |
Indexes:
"ek_instansi_pkey" PRIMARY KEY, btree (id_instansi)
在PHP中进行查询并不困难:
SELECT id_jabatan, a.id_instansi, nama_jabatan, urutan_jabatan, nama_instansi, lokasi
FROM ek_jabatan a
LEFT JOIN ek_instansi b
ON b.id_instansi = a.id_instansi
如何在FeatherJS上进行这样的查询
我已经试过了
users.model.js
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const users = sequelizeClient.define('users', {
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
statusId: {
type: Sequelize.INTEGER,
field: 'status_id'
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
// eslint-disable-next-line no-unused-vars
users.associate = function(models){
users.hasOne(models.userStatus, {
as: 'status',
foreignKey: 'id'
});
};
return users;
};
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const userStatus = sequelizeClient.define('user_status', {
name: {
type: DataTypes.STRING,
allowNull: true
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
userStatus.associate = function (models) {
};
return userStatus;
};
before: {
all: [],
find: [
authenticate('jwt'),
context => {
const sequelize = context.params.sequelize || {};
sequelize.raw = true;
sequelize.include = [
{
model: context.app.services['userStatus'].Model,
as: 'status'
}
];
return context;
},
],
get: [ authenticate('jwt') ],
create: [ hashPassword() ],
update: [ hashPassword(), authenticate('jwt') ],
patch: [ hashPassword(), authenticate('jwt') ],
remove: [ authenticate('jwt') ]
},
user\u status.model.js
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const users = sequelizeClient.define('users', {
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
statusId: {
type: Sequelize.INTEGER,
field: 'status_id'
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
// eslint-disable-next-line no-unused-vars
users.associate = function(models){
users.hasOne(models.userStatus, {
as: 'status',
foreignKey: 'id'
});
};
return users;
};
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const userStatus = sequelizeClient.define('user_status', {
name: {
type: DataTypes.STRING,
allowNull: true
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
userStatus.associate = function (models) {
};
return userStatus;
};
before: {
all: [],
find: [
authenticate('jwt'),
context => {
const sequelize = context.params.sequelize || {};
sequelize.raw = true;
sequelize.include = [
{
model: context.app.services['userStatus'].Model,
as: 'status'
}
];
return context;
},
],
get: [ authenticate('jwt') ],
create: [ hashPassword() ],
update: [ hashPassword(), authenticate('jwt') ],
patch: [ hashPassword(), authenticate('jwt') ],
remove: [ authenticate('jwt') ]
},
users.hooks.js
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const users = sequelizeClient.define('users', {
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true
},
password: {
type: DataTypes.STRING,
allowNull: false
},
statusId: {
type: Sequelize.INTEGER,
field: 'status_id'
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
// eslint-disable-next-line no-unused-vars
users.associate = function(models){
users.hasOne(models.userStatus, {
as: 'status',
foreignKey: 'id'
});
};
return users;
};
const Sequelize = require('sequelize');
const DataTypes = Sequelize.DataTypes;
module.exports = function (app) {
const sequelizeClient = app.get('sequelizeClient');
const userStatus = sequelizeClient.define('user_status', {
name: {
type: DataTypes.STRING,
allowNull: true
}
}, {
hooks: {
beforeCount(options) {
options.raw = true;
}
}
});
userStatus.associate = function (models) {
};
return userStatus;
};
before: {
all: [],
find: [
authenticate('jwt'),
context => {
const sequelize = context.params.sequelize || {};
sequelize.raw = true;
sequelize.include = [
{
model: context.app.services['userStatus'].Model,
as: 'status'
}
];
return context;
},
],
get: [ authenticate('jwt') ],
create: [ hashPassword() ],
update: [ hashPassword(), authenticate('jwt') ],
patch: [ hashPassword(), authenticate('jwt') ],
remove: [ authenticate('jwt') ]
},
当npm启动时,我得到了一个错误。
抛出新错误(this.name+'.+Utils.lowercaseFirst(Type.toString())+'调用的对象不是Sequelize.Model'的子类) 您没有在钩子中正确设置“context.params.sequelize”。您需要这样做:
context => {
// Make sure the object exists
if(!context.params.sequelize) {
context.params.sequelize = {};
}
const sequelize = context.params.sequelize;
sequelize.raw = true;
sequelize.include = [
{
model: context.app.services['userStatus'].Model,
as: 'status',
required: false, // Will always ensure LEFT JOIN
}
];
return context;
}
你遇到的问题更多的是一个后遗症问题。以下是如何使用sequelize进行左连接:。从那里,您可以阅读上的文档,了解如何将其集成到feathers应用程序中。我建议您阅读
findAll
-尤其是选项的文档。包括、选项。包括。其中和选项。包括。必需的:@RyanWheale,您能解释一下代码吗。