sequelize關聯查詢時的分頁題目,join,limit

用到許多數據庫關聯化映照中間件,hibernate,jpa,iBATIS,近來研討nodejs,發明一款不可多得的orm開源東西sequelize,支撐promise,映照設置/查詢/數據輸出等都是json花樣,異常順心,官方文檔很規範但完整說不透其壯大的功用,許多都須要現實用到才體味,就像json一樣變幻莫測,你猜不透它有若干種變化。

好,下面來看一個需求案例:
一條如許的平常查詢語句:

select * from product join producton product.id=place.productid and place.city=1100 where product.price>100 limit 10

用sequelize的query來寫,假如寫成如許:

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 }
    }],
    limit:12
})

現實上運轉的sql是這個:

select product.*, place.* from (select * from product where product.price>100 limit 10) join place on product.id=place.productid and place.city=1100

想要的效果是毛病的,分頁時沒有把city:1100 前提限定了,效果有差別,那怎麼辦?

因而找要領,看到有人運用加subQuery:false前提來處置懲罰,以下:

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 }
    }],
    limit:10,
    subQuery:false   //不讓在子查詢里分頁,全局處置懲罰
})

如許關於只含一個include關聯的查詢卻是題目不大,假如include多個對象,關聯的對象有1對多,多對多的關聯,就不好掌握了。

我的解決要領是,在須要一對一關聯的表中到場required:true,如許就會將這個前提放在分頁之前實行,

models.product.findAll({
    where: ["price>=?", 100 ],
    include: [{
        model:models.product,
        where: { city:1100 },
        required:true  //inner join體式格局
    }],
    limit:10,
})

運轉時sql以下:

select product.*,place.* from product join place on product.id=place.productid and place.city=1100 where product.price>100 limit 10

required參數平常是指關聯對象是外聯照樣內聯,內聯required=true能夠示意內聯前提優先,分頁在後。
以上內容進僅供參考,運用場景差別,明白也不一樣。

    原文作者:微笑漿糊
    原文地址: https://segmentfault.com/a/1190000015297592
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞