проверяет связанные модели из верхней модели, где запрос - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть модель бронирования, которая имеет много отношений с отелями, а гостиница имеет отношения один к одному с поставщиками. Что мне нужно, это получить все бронирование, где supplier_id = 33333. Я пытаюсь это

BOOKINGS.findAll({
        where: {
            'hotels.supplier.supplier_id' : '32',                
        },
        include: [
            {
            model: HOTELS,
            include: [
                {
                    model: SUPPLIERS,
            ],

            }
        ],
        limit : 30,
        offset: 0

    })

Это выдает ошибку, как hotels.supplier ... столбец не найден .. Я пробовал все вещи, потому что на документах Sequelzeэто только дает решение, чтобы добавить проверку, которая добавляет, где внутри include, который я не могу использовать, поскольку он добавляет подзапросы. Я не хочу добавлять, где проверять вместе с моделью поставщика внутри массива include, потому что он добавляет подзапросы, поэтому, если у меня 1000 заказов, то для всех заказов он добавит подзапрос, который приводит к сбою моего API.

Мне нужны решения, подобные этому запросу в Sequelize.

Выберите col1, col2, col3 из BOOKINGS, позвольте присоединиться к HOTELS на BOOKINGS.booking_id = HOTELS.booking_id, внутреннее объединение SUPPLIERS на BOOKINGS.supplier_id = SUPPLIERS.supplier_id

1 Ответ

0 голосов
/ 06 ноября 2019

Добавление where в объект включения не добавит подзапрос. Он просто добавит предложение where к JOIN, которое применяется к модели поставщика. Это не приведет к краху вашего API в любом случае. Вы можете проверить его на своем локальном компьютере много раз, чтобы убедиться.

BOOKINGS.findAll({
   include: [
      {
         model: HOTELS,
         include: [
            {
               model: SUPPLIERS,
               where: { supplier_id: 32 }
            }
         ]
      }
   ],
   limit: 30,
   offset: 0
})

Если вы все еще хотите использовать запрос на верхнем уровне, вы можете использовать sequelize.where + sequelize.literal, но вы это сделаетенужно использовать псевдонимы таблиц, которые сиквелизируют присвоения. например, этот псевдоним для таблицы поставщиков не будет работать hotels.supplier.supplier_id. Псевдонимы таблицы секвенирования, как в примере, который я показал ниже:

BOOKINGS.findAll({
    where: sequelize.where(sequelize.literal("`hotels->suppliers`.supplier_id = 32")),
    include: [
        {
            model: HOTELS,
            include: [SUPPLIERS]
        }
    ],
    limit: 30,
    offset: 0
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...