Sequelize.js Sequelize:查找没有关联的条目

Sequelize.js Sequelize:查找没有关联的条目,sequelize.js,Sequelize.js,鉴于以下简单模型: class A extends Model {} A.init({ aField: DataTypes.STRING, }, { sequelize }); class B extends Model {} B.init({ bField: DataTypes.STRING, }, { sequelize }); A.hasMany(B); // this creates the B.AId column // populate await A.cr

鉴于以下简单模型:

class A extends Model {}
A.init({
    aField: DataTypes.STRING,
}, { sequelize });

class B extends Model {}
B.init({
    bField: DataTypes.STRING,
}, { sequelize });

A.hasMany(B); // this creates the B.AId column


// populate

await A.create({
    aField: 'fooA',
    Bs: [{ bField: 'fooB' }]
}, { include: [B] });

await A.create({ aField: 'barA' });
await A.create({ aField: 'bazA' });
我不知道如何选择没有B项的第一个A模型实例。 在上一个案例中,返回的只是barA和bazA

以下操作不起作用,它返回foo:


生成的查询是:选择A.*,Bs.id作为Bs.id,Bs.bField作为Bs.bField,Bs.AId作为Bs.AId从选择A.id,A.affield从AS作为限制1作为左外部连接Bs作为Bs在A.id=Bs.AId上,Bs.AId为空

这是限制和关联的问题。类似问题:

Sequelize将关联转换为子查询,但在您的用例中,您需要一个关联,然后限制整个关联结果。 为此,可以使用subQuery:false禁用子查询

等一等{ 包括:[{ 型号:B, 必填项:false, 其中:{ “AId”:null, } }], 子查询:false }; 这仍然无法实现您想要的,因为where in include将生成和条件ON

生成的查询:

选择'A`.'id`、'A`.'aField`、'A`.'createdAt`、'A`.'updatedAt`、'Bs`.'id`作为'Bs.id`, `Bs`.`bField`作为`Bs.bField`,`Bs`.`createdAt`作为`Bs.createdAt`, `Bs`.`updatedAt`AS`Bs.updatedAt`、`Bs`.`AId`AS`Bs.AId` 从'As'到'A' 左外连接'Bs'作为'A'上的'Bs'。'id`='Bs`.'AId`和'Bs`.'AId`为空 限值1; 你想要的是

... ... 在'A`.'id`='Bs`.'AId`上,其中'Bs`.'AId`为空 限值1; 为了得到WHERE,你可以把WHERE子句放在A中

等一等{ 包括:[{ 型号:B, 必填项:false }], 其中:{ “$Bs.AId$”:null }, 子查询:false };
你希望巴拉和巴扎都回来吗?还是只有barA?是的,使用findAll,但这里我只希望得到一个入口谢谢,这很好!我找不到子查询的文档,你有指针吗?我也找不到好的文档。我只是从一些github问题或stackoverflow中知道子查询。很抱歉但我很高兴听到这个消息。
await A.findOne({
    include: [{
        model: B,
        required: false,
        where: {
            'AId': null,
        }
    }],
});