2016-08-10 105 views
3

我試圖2個小時解決一個不是一個小問題。 我在一個生成的yeoman Angular-fullstack應用程序。sequelize,聲明(where)在聲明(where)

我想與sequ​​elize寫這樣的代碼:

SELECT * 
FROM demand 
WHERE city_id NOT IN (
SELECT city_id 
FROM demand 
WHERE user_id=req.params.user_id) 

我還沒有下面的代碼,但不起作用。我只得到[]

export function getCity(req, res) { 
    return Demand.findAll({ 
    where: { 
     city_id:{ $notIn: Demand.findAll({ 
     attributes: ['city_id'], 
     where: { 
      user_id: req.params.user_id, 
     } 
     })} 
    } 
    }) 
    .then(handleEntityNotFound(res)) 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
} 

你有線索嗎? 謝謝。

回答

2

我還沒找到一個很好的解決方案:我終於用查詢寫了。

export function showDemandArtistNoUser(req, res) { 
    return db.sequelize.query('SELECT * FROM demands WHERE city_id NOT IN (SELECT city_id FROM demands WHERE user_id='+req.params.user_id+')', { type: db.sequelize.QueryTypes.SELECT }) 
    .then(handleEntityNotFound(res)) 
    .then(respondWithResult(res)) 
    .catch(handleError(res)); 
} 

而且隨着我的角fullstack,我有我的頁面上添加:

import db from '../../sqldb'; 
3

從你的第一個查詢的問題是存在的,因爲sequelize的的findall方法返回一個承諾。

使用在與sequ​​elize條件是通過字面方法子查詢的唯一方法:sequelize.literal('your query');

檢查這個問題,以便獲得更多的信息https://github.com/sequelize/sequelize/issues/3961

1

我在項目中遇到類似的問題。 我選擇來實現它的方式是有兩個原因有所不同:在時間

  1. 如果在一個點Sequelize決定實行分查詢 - 語法已準備就緒。
  2. 再次使用Sequelize保護SQL注入。

這是我的例子,希望它有幫助。

const sqlSubquery = sequelize.dialect.QueryGenerator.selectQuery('demand', 
    attributes: ['city_id'], 
    where: { 
     user_id: req.params.user_id 
    }) 
    .slice(0,-1); // to remove the ';' from the end of the SQL 

Demand.findAll({ 
    where: { 
     city_id: { 
      $notIn: sequelize.literal('(' + sqlSubquery + ')'), 
     } 
    } 
}); 

有些人可能會選擇不使用tempSQL變量,簡單地建立查找結構內部的SQL(可能使用一個輔助方法?)

我也覺得這可能是一個子查詢的基礎因爲它幾乎使用相同的語法,因此可以擴展爲續集。