同时使用 '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++) {