简体   繁体   中英

sequelize where relation is null

I have an issue with sequelize. Here is what I'm trying to do:

return pointsTransaction.findAndCountAll({
    where:{
        user_id: userId
    },
    limit: opts.limit,
    offset: opts.offset,
    include:[{
        model:sequelize.models.pointsPendingtransaction
    }]
});

The generated query looks like that:

SELECT "pointsTransaction".*,
"pointsPendingtransactions"."transaction_ptr_id" AS "pointsPendingtransactions.transactionPtrId",
"pointsPendingtransactions"."is_active" AS "pointsPendingtransactions.isActive",
"pointsPendingtransactions"."transaction_id" AS "pointsPendingtransactions.transaction_id" 
FROM (
SELECT "pointsTransaction"."id",
"pointsTransaction"."date_time" AS "dateTime",
"pointsTransaction"."details",
"pointsTransaction"."points",
"pointsTransaction"."user_id" 
FROM "points_transaction" AS "pointsTransaction" 
WHERE "pointsTransaction"."user_id" = 10002 LIMIT 1000
) AS "pointsTransaction" 
LEFT OUTER JOIN "points_pendingtransaction" AS "pointsPendingtransactions" 
ON "pointsTransaction"."id" = "pointsPendingtransactions"."transaction_id"

So in SQL I would just need to add that line at the end of my query to make it work: WHERE "pointsPendingtransactions"."transaction_id" IS null

So my question is, how can I do that with sequelize? I tried many different ways but no one worked...

Try to do next

        where: {
            transaction_id: {
              $eq: null
            }
        }

to generate IS NULL


return pointsTransaction.findAndCountAll({
    where:{
        user_id: userId
    },
    limit: opts.limit,
    offset: opts.offset,
    include:[{
        model:sequelize.models.pointsPendingtransaction,
        where: {
            transaction_id: {
              $eq: null
            }
        }
    }]
});

If you are using Sequelize's symbol operators from Sequelize.Op then ...

return pointsTransaction.findAndCountAll({
    where:{
        user_id: userId
    },
    limit: opts.limit,
    offset: opts.offset,
    include:[{
        model:sequelize.models.pointsPendingtransaction,
        where: {
            transaction_id: {
              // "$eq" changes to "[Op.eq]"
              [Op.eq]: null
            }
        }
    }]
});

$eq and [Op.eq] are not needed tested as of Sequelize 6.14.0

It works without them, just as it does for other values, eg:

where: {
  transaction_id: null
}

produces IS NULL .

You do need the magic syntax for IS NOT NULL however as usual, achieved with:

where: {
  transaction_id: {
    [Op.ne]: null
  }
}

The where inside include part of answer is then the same as for other non null values, see eg: Sequelize find based on association

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM