#sequelize.js
#sequelize.js
Вопрос:
Представьте, что у меня есть таблица ассоциаций [PersonPhones] между моими таблицами [Persons] и [Phones]. И я запускаю следующий запрос:
Продолжение
Person.findAll({
include: [{
model: PersonPhones,
required: false,
include: [{
model: Phones,
required: true
}]
}]
});
Вопрос:
Я бы предположил, что получу эквивалент запроса 1 ниже, который возвращает 4 строки. Но я получаю запрос 2, который возвращает всего 2 строки. Есть ли способ заставить Sequelize вложить ВНУТРЕННЕЕ СОЕДИНЕНИЕ в ЛЕВОЕ СОЕДИНЕНИЕ?
SQL
CREATE TABLE #Persons (id INT, name VARCHAR(50))
CREATE TABLE #Phones (id INT, number VARCHAR(20))
CREATE TABLE #PersonPhones (personId INT, phoneId INT)
INSERT INTO #Persons VALUES (1,'Adam'), (2, 'Bob'), (3, 'Carl')
INSERT INTO #Phones VALUES (1, '555-1234'), (2, '555-2345'), (3, '555-3456')
INSERT INTO #PersonPhones VALUES (1,1), (1,3), (2, 4)
-- The following are not the same queries
-- Query 1
SELECT *
FROM #Persons p
LEFT JOIN #PersonPhones pp
INNER JOIN #Phones ph ON ph.id = pp.phoneID
ON pp.personID = p.ID
-- Query 2
SELECT *
FROM #Persons p
LEFT JOIN #PersonPhones pp ON pp.personID = p.ID
INNER JOIN #Phones ph ON ph.id = pp.phoneID
Ответ №1:
После разговора с одним из создателей библиотеки мне сказали, что вложенные соединения не поддерживаются. Я создал проблему с их проектом GitHub. Не стесняйтесь комментировать или следовать оттуда.
Ответ №2:
Попробуйте это:
-- Query 1
SELECT *
FROM #Persons p
LEFT JOIN (
select * from #PersonPhones pp
INNER JOIN #Phones ph ON ph.id = pp.phoneID
) x ON x.personID = p.ID
Комментарии:
1. Спасибо за ваш ответ, но это Sequelize.js вопрос.
2. @astangelo Извините, не понял. 🙁