用到許多數據庫關聯化映照中間件,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能夠示意內聯前提優先,分頁在後。
以上內容進僅供參考,運用場景差別,明白也不一樣。