Может ли Sequelize обрабатывать несколько ключей, связанных с одной таблицей?

Скажем, у меня есть таблица под названием Table1. Для одного бизнес-стола есть 3 идентификатора бизнеса.

Table1
---------
idBusiness1, idBusiness2, idBusiness3, etc.

Business
---------
idBusiness, Name

Есть ли способ связать эти две таблицы выше, чтобы создать запрос Sequelize (кроме необработанного запроса), чтобы отменить имя всех трех компаний?

SQL выглядит так:

SELECT 
 t1.id, B1.Name AS 'Business1', B2.Name AS 'Business2'
FROM
 Table1 t1
 LEFT OUTER JOIN
 Business b1 ON idBusiness1 = b1.idBusiness
 LEFT OUTER JOIN
 Business b2 ON idBusiness2 = b2.idBusiness
;
1 ответ

Если вы имеете в виду, что таблица 1 содержит поле idBusiness с идентификаторами idBusiness1, idBusiness2, idBusiness3,..., то, чего вы хотите достичь в формате SQL, является

db.seq.query('
SELECT * FROM Business 
INNER JOIN Table1 ON Table1.idBusiness = Business.idBusiness ').success(function(rows) {
 res.json(rows);
});

Используя формат ORM, вы должны использовать активную загрузку с параметром include:

Table1.findAll({
 include: [{
 model: Business,
 required: true
 }]
}).then(results => {
 /* ... */
}.);

Если вы имеете в виду, что у вас есть 3 разных поля, и вы хотите, чтобы имена бизнес-идентификаторов равны по крайней мере одному из них:

SELECT * from Business
INNER JOIN Table1 ON Business.idBusiness IN (Table1.idBusiness1, Table1.idBusiness2, Table1.idBusiness3)

В формате ORM самый простой способ, о котором я могу думать, это

Business.findAll({
 where: { id: list }
}

Где вы получите все идентификаторы из таблицы 1 из запроса findAll и преобразуете результат в массив всех этих идентификаторов. Я думаю, результат Table1.findAll {} будет иметь формат

[{idBusiness1: 1, idBusiness2: 2, idBusiness3: 3}, {idBusiness1: 42, idBusiness2: 32, idBusiness: 70}]

Таким образом, с небольшим кодом вы перебираете этот список, чтобы сформировать другой

finalList = [];
list.forEach((item) => {
 finalList.push(item.idBusiness1)
 finalList.push(item.idBusiness2)
 finalList.push(item.idBusiness3)
}

Если в таблице 1 имеется более трех полей, вы можете перебирать свойства объекта Javascript для обобщения этих трех нажатий. Дайте мне знать, если это так, и вам нужна помощь.

Обновить:

Поскольку ОП разъясняется, установка required:false в запросе будет включать внутренние соединения в левое (внешнее) соединение.

Когда вы добавляете опцию where, она автоматически устанавливает значение true, что превращает объединение во внутреннее соединение. См. Описание параметров options.include[].where в http://docs.sequelizejs.com/class/lib/model.js~Model.html#findalloptions-********************.

Не представляется возможным, чтобы синтаксис Sequelize объединялся в одну и ту же таблицу, вы бы включили ту же таблицу, что и та, которую вы вызываете. Вот почему Sequelize поддерживает необработанные запросы в этих конкретных случаях...

licensed under cc by-sa 3.0 with attribution.