Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sequelize嵌套的include with where子句_Mysql_Node.js_Express_Sequelize.js - Fatal编程技术网

Mysql sequelize嵌套的include with where子句

Mysql sequelize嵌套的include with where子句,mysql,node.js,express,sequelize.js,Mysql,Node.js,Express,Sequelize.js,我正在使用sequelize进行一些过滤 我当前的表格结构: 表1包含项目(具有图像)和用户(不相关) 表1通过表1上的表2ID与表2有直接关系(而不是表3) 表2通过表2上的表3ID与表3有直接关系(而不是表4) 表3通过表3上的表4ID与表4有直接关系 我也想在表3和表4上进行过滤,因为我只能使用顶级where子句在表2上进行过滤 我填写where条件的方式仅使用基本对象: var Table2id = parseInt(req.query.Table2id) || null

我正在使用sequelize进行一些过滤

我当前的表格结构:

  • 表1包含项目(具有图像)和用户(不相关)
  • 表1通过表1上的表2ID与表2有直接关系(而不是表3)
  • 表2通过表2上的表3ID与表3有直接关系(而不是表4)
  • 表3通过表3上的表4ID与表4有直接关系
我也想在表3和表4上进行过滤,因为我只能使用顶级where子句在表2上进行过滤

我填写where条件的方式仅使用基本对象:

var Table2id       = parseInt(req.query.Table2id) || null,
    Table3id       = parseInt(req.query.Table3id) || null,
    Table4id       = parseInt(req.query.Table4id) || null,
    whereCondition = { deleted: 0 }

if (Table2id) { whereCondition['table2id'] = Table2id }
if (Table3id) { whereCondition['table3id'] = Table3id }
if (Table4id) { whereCondition['table4id'] = Table4id }

Table1.findAndCountAll({
        limit: limit,
        offset: offset,
        order: 'created_at DESC',
        where: whereCondition,
        include: [
            {
                model: User,
            }, {
                model: Item,
                include: [
                    {
                        model: Image
                    }
                ]
            }, {
                model: Table2,
                include: [
                    {
                        model: Table3,
                        include: [
                            {
                                model: Table4,
                            }
                        ]
                    }
                ]
            }
        ],
}).then(function (results) { res.json(results) })
我尝试使用我发现的一些黑客,比如
whereCondition['$Table3.table3id$']=table3id
,但没有用

如何筛选嵌套的包含项?有没有其他方法可以构造查询,这样我就不必嵌套include,但仍然保留此数据结构(有没有比我想象的更好的方法来构造此数据结构)

edit:因此我希望能够对包含的表进行排序,并且在顶级where子句中至少设置一个参数(比如deleted=0)

我已尝试按如下方式修改查询:

var Table2id       = parseInt(req.query.Table2id) || null,
    Table3id       = parseInt(req.query.Table3id) || null,
    Table4id       = parseInt(req.query.Table4id) || null,
    whereCondition = { deleted: 0 },
    extraWhereCondition = {}

if (Table2id) { whereCondition['table2id'] = Table2id } // figured this can be left alone in this particular case (as it works in top-level where clause)
if (Table3id) { extraWhereCondition['table3id'] = Table3id }
if (Table4id) { extraWhereCondition['table4id'] = Table4id }

Table1.findAndCountAll({
        limit: limit,
        offset: offset,
        order: 'created_at DESC',
        where: whereCondition,
        include: [
            {
                model: User,
            }, {
                model: Item,
                include: [
                    {
                        model: Image
                    }
                ]
            }, {
                model: Table2,
                include: [
                    {
                        model: Table3,
                        where: extraWhereCondition,
                        include: [
                            {
                                model: Table4,
                                where: extraWhereCondition,
                            }
                        ]
                    }
                ]
            }
        ],
}).then(function (results) { res.json(results) })

但这给了我一个错误,即Table2.Table3.Table4.table4id在字段列表中是未知的。

您只需要知道将
放在哪里的方法,您还可以创建option对象,然后将其传递到需要的地方

  • 在每个
    中放入
    条件
    ,必要时包括
  • 要求正确和错误
    更改连接规则
当使用include.where筛选急切加载的模型时 include.required隐式设置为true。这意味着 连接是通过返回具有任何匹配子项的父模型来完成的

  • sequelize称之为“急切加载”
更多详细信息,请访问
var Table2=require(“../models/”)。表2//还有你需要的其他模型
var选项={
极限:极限,
抵销:抵销,
订单:“在描述处创建”,
其中:{已删除:0},
包括:[
{
型号:用户,
},
{
型号:项目,
要求:正确,
包括:[
{
型号:图片,
},
],
},
{
型号:表2,
包括:[
{
型号:表3,
其中:{已删除:0},
包括:[
{
型号:表4,
其中:{已删除:0},
},
],
},
],
},
],
};
表1.findAndCountAll(选项)。然后(函数(结果){
res.json(结果);
});

您可以在每个include@Adiii这在字段列表中给了我一个
未知列“Table2.Table3.Table4.Table4id”
错误。您需要什么?事实上,我没有收到您的问题,如果您需要内部include中的where子句,请告诉我var user=require(“../models/”)。表1;var user=require('../models/')。表2;include:[{model:table1,required:true,include:[{model:table2,required:true,其中:{condition}]}]但是你在里面放东西的方式包括​ 根据doc,它是无效的