продолжение, Заявление (где) в заявлении (где)

Я пытаюсь в течение 2 часов решить небольшую проблему, которая не является одной. Я нахожусь в сгенерированном приложении yoman Angular-fullstack.

Я хочу написать этот код с sequenceize:

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));
}

У вас есть ключ? Спасибо.


person Wandrille    schedule 10.08.2016    source источник


Ответы (3)


Проблема с вашим первым запросом заключается в том, что метод findall для sequenceize возвращает обещание.

Единственный способ использовать подзапросы в условиях where с sequenceize — использовать литеральный метод: sequelize.literal('your query');

Проверьте эту проблему, чтобы получить дополнительную информацию https://github.com/sequelize/sequelize/issues/3961< /а>

person Simon Robain    schedule 19.08.2016

Я не нашел хорошего решения: я, наконец, написал запрос.

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));
}

И с моим angular-fullstack я должен добавить на свою страницу:

 import db from '../../sqldb';
person Wandrille    schedule 11.08.2016

Я столкнулся с подобной проблемой в моем проекте. Способ, который я выбрал для реализации, немного отличается по двум причинам:

  1. Если в какой-то момент Sequelize решит реализовать подзапросы — синтаксис готов.
  2. Используйте защиту Sequelize от SQL-инъекций.

Вот мой фрагмент кода, надеюсь, он поможет.

const tempSQL = sequelize.dialect.QueryGenerator.selectQuery('MyOtherTable',{
    attributes: ['fkey'],
    where: {
         field1: 1,
         field2: 2,
         field3: 3
    }})
    .slice(0,-1); // to remove the ';' from the end of the SQL

MyTable.find( {
    where: {
        id: {
             $notIn: sequelize.literal('(' + tempSQL + ')'),
        }
    } 
} );

Некоторые люди могут предпочесть не использовать переменную tempSQL и просто построить SQL внутри структуры поиска (может быть, используя вспомогательный метод?)

Я также думаю, что это может быть основой для расширения подзапросов для продолжения, поскольку оно использует почти тот же синтаксис.

person Shahar Hadas    schedule 08.02.2017