同时使用 'Where' 和 'Include' 语句拉取数据
Pulling data with 'Where' and 'Include' statements at the same time
我已经设法让我的 include 语句与我的外键一起工作,但是当我尝试将 'where' 语句添加到 findAll 语句时,我收到以下错误。我已经多次检查我的外键和模型,我看不出有任何问题。
下面API的语法正确吗?密钥中的数据很重要,所以我不想花更多时间在解决方法上。我已经看到其他示例在其中一个包含键中包含 where 语句,但我想要提取的字段在主 table 上,所以我认为这不是相同的情况。
Unhandled rejection Error: Include unexpected. Element has to be either a Model, an Association or an object.
API
const sequelize = require("pg");
const { Sequelize, Op, Model, DataTypes } = require("sequelize");
exports.schoolDiveLogApproval = (req, res) => {
try {
const schoolID = req.params.schoolID;
diveLog.findAll({
include: [{
model: diveType, as: 'diveTypeID_FK2',
}, {
model: diveSchool, as: 'diveSchoolID_FK',
}, {
model: current, as: 'currentID_FK',
}, {
model: visibility, as: 'visibilityID_FK',
}, {
model: user, as: 'userID_FK1',
}, {
model: diveSpot, as: 'diveSpotID_FK2'
}],
where: {
[Op.and]: [
{diveSchoolID: schoolID},
{diveVerifiedBySchool: false}
]
},
})
...........
更新
错误信息
{
"message": "missing FROM-clause entry for table \"diveLog\""
}
控制器 API 原始 SQL
exports.schoolDiveLogApproval = async (req, res) => {
try {
const schoolID = req.params.schoolID;
const { QueryTypes } = require('sequelize');
await diveLog.sequelize.query(
'SELECT * '+
'FROM "diveLogs" '+
'LEFT OUTER JOIN "diveTypes" AS "diveTypeID_FK2" ON "diveLogs"."diveTypeID" = "diveTypeID_FK2"."diveTypeID" ' +
'LEFT OUTER JOIN "diveSchools" AS "diveSchoolID_FK" ON "diveLog"."diveSchoolID" = "diveSchoolID_FK"."diveSchoolID" ' +
'LEFT OUTER JOIN "currents" AS "currentID_FK" ON "diveLog"."currentID" = "currentID_FK"."currentID" ' +
'LEFT OUTER JOIN "visibilities" AS "visibilityID_FK" ON "diveLog"."visibilityID" = "visibilityID_FK"."visibilityID" ' +
'LEFT OUTER JOIN "userLogins" AS "userID_FK" ON "diveLog"."userID" = "userID_FK1"."userID" ' +
'LEFT OUTER JOIN "diveSpots" AS "diveSpotID_FK2" ON "diveLog"."diveSpotID" = "diveSpotFK2"."diveSpotID" ' +
'WHERE "diveLogs"."diveSchoolID" = ? ' +
'AND "diveLogs"."diveVerifiedBySchool" = ?',
{
replacements: [schoolID, false],
type: QueryTypes.SELECT
}
)
根据 pgAdmin 数据库,所有 table 和列名称看起来都是正确的,所以除了语法之外,我看不出问题出在哪里。
我已经偏离了 SQL 在 IDE 终端中执行的方式,所以理论上它应该执行。这更有可能与我传递 id 的方式有关吗?
好吧,我真的已经尝试了几分钟围绕这个续集,但我真的建议你学习和使用原始 SQL,它比那更容易和通用。
在尝试设置和理解此 sqlize 半小时后,发现了很多像这样的奇怪问题:
选择像 id 这样不存在的列,在 table “user_infoS(?)” 的名称中突然添加一个“s”..所以我放弃了,然后上来了如果我正确理解了你的问题,我的查询可能对你有帮助。
如果您发送正确的架构,我可以进一步帮助您,但是,抱歉,我不能花更多时间在这个续集中,这太糟糕了。
const { QueryTypes } = require('sequelize');
await sequelize.query(
'SELECT *'+
'FROM diveLog l'+
'JOIN diveType t ON l.diveTypeId = t.id'+
'JOIN diveSchool s ON l.diveSchoolId = s.id'+
'JOIN current c ON l.currentId = c.id'+
'JOIN visibility v ON l.visibilityId = v.id'+
'JOIN user u ON l.userId = u.id'+
'JOIN diveSpot sp ON l.diveSpotId = sp.id'+
'WHERE diveSchoolID = ?'+
'AND diveVerifiedBySchool = ?',
{
replacements: [schoolID, false],
type: QueryTypes.SELECT
}
);
关于您 API 中的第一个错误,确保您需要如下模型:
const { diveLog, diveType, diveSchool, diveSchool, current, visibility, user, diveSpot } = require('../models');
第二条错误信息:
{
“消息”:“关系“潜水日志”不存在”
}
表示在你的数据库中找不到table“divelogs”,仔细检查table是否存在,如果不存在,运行你的迁移创建table。请注意,如果启用,Sequelize 将自动使您的 table 名称变为复数。如果您定义一个名为 User 的模型,Sequelize 将创建 table 作为 Users
第二个错误:您在别名上输入错误,有时使用“devLogS”,有时使用“devLoG”(单数形式)。
在这里询问之前请多尝试,我们不会为您代劳。
当我回到使用带有 include / where 子句的原始 Sequelize 时,我从 API 中删除了 [Op and],然后在文件顶部重新声明了每个模型并成功了。
exports.schoolDiveLogApproval = async (req, res) => {
try {
const schoolID = req.params.schoolID;
diveLog.findAll({
include: [{
model: diveType, as: 'diveTypeID_FK2',
}, {
model: diveSchool, as: 'diveSchoolID_FK',
}, {
model: current, as: 'currentID_FK',
}, {
model: visibility, as: 'visibilityID_FK',
}, {
model: user, as: 'userID_FK1',
}, {
model: diveSpot, as: 'diveSpotID_FK2'
}],
where: [{
diveSchoolID: req.params.schoolID,
diveVerifiedBySchool: false
}],
})
.then((diveLog) => {
const schoolDiveLogList = [];
for (i = 0; i < diveLog.length; i++) {
我已经设法让我的 include 语句与我的外键一起工作,但是当我尝试将 'where' 语句添加到 findAll 语句时,我收到以下错误。我已经多次检查我的外键和模型,我看不出有任何问题。
下面API的语法正确吗?密钥中的数据很重要,所以我不想花更多时间在解决方法上。我已经看到其他示例在其中一个包含键中包含 where 语句,但我想要提取的字段在主 table 上,所以我认为这不是相同的情况。
Unhandled rejection Error: Include unexpected. Element has to be either a Model, an Association or an object.
API
const sequelize = require("pg");
const { Sequelize, Op, Model, DataTypes } = require("sequelize");
exports.schoolDiveLogApproval = (req, res) => {
try {
const schoolID = req.params.schoolID;
diveLog.findAll({
include: [{
model: diveType, as: 'diveTypeID_FK2',
}, {
model: diveSchool, as: 'diveSchoolID_FK',
}, {
model: current, as: 'currentID_FK',
}, {
model: visibility, as: 'visibilityID_FK',
}, {
model: user, as: 'userID_FK1',
}, {
model: diveSpot, as: 'diveSpotID_FK2'
}],
where: {
[Op.and]: [
{diveSchoolID: schoolID},
{diveVerifiedBySchool: false}
]
},
})
...........
更新
错误信息
{
"message": "missing FROM-clause entry for table \"diveLog\""
}
控制器 API 原始 SQL
exports.schoolDiveLogApproval = async (req, res) => {
try {
const schoolID = req.params.schoolID;
const { QueryTypes } = require('sequelize');
await diveLog.sequelize.query(
'SELECT * '+
'FROM "diveLogs" '+
'LEFT OUTER JOIN "diveTypes" AS "diveTypeID_FK2" ON "diveLogs"."diveTypeID" = "diveTypeID_FK2"."diveTypeID" ' +
'LEFT OUTER JOIN "diveSchools" AS "diveSchoolID_FK" ON "diveLog"."diveSchoolID" = "diveSchoolID_FK"."diveSchoolID" ' +
'LEFT OUTER JOIN "currents" AS "currentID_FK" ON "diveLog"."currentID" = "currentID_FK"."currentID" ' +
'LEFT OUTER JOIN "visibilities" AS "visibilityID_FK" ON "diveLog"."visibilityID" = "visibilityID_FK"."visibilityID" ' +
'LEFT OUTER JOIN "userLogins" AS "userID_FK" ON "diveLog"."userID" = "userID_FK1"."userID" ' +
'LEFT OUTER JOIN "diveSpots" AS "diveSpotID_FK2" ON "diveLog"."diveSpotID" = "diveSpotFK2"."diveSpotID" ' +
'WHERE "diveLogs"."diveSchoolID" = ? ' +
'AND "diveLogs"."diveVerifiedBySchool" = ?',
{
replacements: [schoolID, false],
type: QueryTypes.SELECT
}
)
根据 pgAdmin 数据库,所有 table 和列名称看起来都是正确的,所以除了语法之外,我看不出问题出在哪里。
我已经偏离了 SQL 在 IDE 终端中执行的方式,所以理论上它应该执行。这更有可能与我传递 id 的方式有关吗?
好吧,我真的已经尝试了几分钟围绕这个续集,但我真的建议你学习和使用原始 SQL,它比那更容易和通用。
在尝试设置和理解此 sqlize 半小时后,发现了很多像这样的奇怪问题:
选择像 id 这样不存在的列,在 table “user_infoS(?)” 的名称中突然添加一个“s”..所以我放弃了,然后上来了如果我正确理解了你的问题,我的查询可能对你有帮助。
如果您发送正确的架构,我可以进一步帮助您,但是,抱歉,我不能花更多时间在这个续集中,这太糟糕了。
const { QueryTypes } = require('sequelize');
await sequelize.query(
'SELECT *'+
'FROM diveLog l'+
'JOIN diveType t ON l.diveTypeId = t.id'+
'JOIN diveSchool s ON l.diveSchoolId = s.id'+
'JOIN current c ON l.currentId = c.id'+
'JOIN visibility v ON l.visibilityId = v.id'+
'JOIN user u ON l.userId = u.id'+
'JOIN diveSpot sp ON l.diveSpotId = sp.id'+
'WHERE diveSchoolID = ?'+
'AND diveVerifiedBySchool = ?',
{
replacements: [schoolID, false],
type: QueryTypes.SELECT
}
);
关于您 API 中的第一个错误,确保您需要如下模型:
const { diveLog, diveType, diveSchool, diveSchool, current, visibility, user, diveSpot } = require('../models');
第二条错误信息:
{ “消息”:“关系“潜水日志”不存在” }
表示在你的数据库中找不到table“divelogs”,仔细检查table是否存在,如果不存在,运行你的迁移创建table。请注意,如果启用,Sequelize 将自动使您的 table 名称变为复数。如果您定义一个名为 User 的模型,Sequelize 将创建 table 作为 Users
第二个错误:您在别名上输入错误,有时使用“devLogS”,有时使用“devLoG”(单数形式)。
在这里询问之前请多尝试,我们不会为您代劳。
当我回到使用带有 include / where 子句的原始 Sequelize 时,我从 API 中删除了 [Op and],然后在文件顶部重新声明了每个模型并成功了。
exports.schoolDiveLogApproval = async (req, res) => {
try {
const schoolID = req.params.schoolID;
diveLog.findAll({
include: [{
model: diveType, as: 'diveTypeID_FK2',
}, {
model: diveSchool, as: 'diveSchoolID_FK',
}, {
model: current, as: 'currentID_FK',
}, {
model: visibility, as: 'visibilityID_FK',
}, {
model: user, as: 'userID_FK1',
}, {
model: diveSpot, as: 'diveSpotID_FK2'
}],
where: [{
diveSchoolID: req.params.schoolID,
diveVerifiedBySchool: false
}],
})
.then((diveLog) => {
const schoolDiveLogList = [];
for (i = 0; i < diveLog.length; i++) {