不要怂,就是干,撸起袖子干!

Commit 2f5b4e03 by Oleg Ozimok Committed by Felix Becker

fix(subquery): check required association exists (#7905)

1 parent f5927a6a
...@@ -1331,7 +1331,8 @@ const QueryGenerator = { ...@@ -1331,7 +1331,8 @@ const QueryGenerator = {
include.where || {} include.where || {}
] ]
}, },
limit: 1 limit: 1,
tableAs: include.as
}, include.model); }, include.model);
const subQueryWhere = this.sequelize.asIs([ const subQueryWhere = this.sequelize.asIs([
......
...@@ -848,7 +848,7 @@ const QueryGenerator = { ...@@ -848,7 +848,7 @@ const QueryGenerator = {
if (options.limit || options.offset) { if (options.limit || options.offset) {
if (!options.order || options.include && !orders.subQueryOrder.length) { if (!options.order || options.include && !orders.subQueryOrder.length) {
fragment += options.order && !isSubQuery ? ', ' : ' ORDER BY '; fragment += options.order && !isSubQuery ? ', ' : ' ORDER BY ';
fragment += this.quoteTable(model.name) + '.' + this.quoteIdentifier(model.primaryKeyField); fragment += this.quoteTable(options.tableAs || model.name) + '.' + this.quoteIdentifier(model.primaryKeyField);
} }
if (options.offset || options.limit) { if (options.offset || options.limit) {
......
...@@ -372,6 +372,49 @@ suite(Support.getTestDialectTeaser('SQL'), () => { ...@@ -372,6 +372,49 @@ suite(Support.getTestDialectTeaser('SQL'), () => {
default: 'SELECT [User].[name], [User].[age], [Posts].[id] AS [Posts.id], [Posts].[title] AS [Posts.title] FROM [User] AS [User] LEFT OUTER JOIN [Post] AS [Posts] ON [User].[id] = [Posts].[user_id];' default: 'SELECT [User].[name], [User].[age], [Posts].[id] AS [Posts.id], [Posts].[title] AS [Posts.title] FROM [User] AS [User] LEFT OUTER JOIN [Post] AS [Posts] ON [User].[id] = [Posts].[user_id];'
}); });
}); });
it('include (subQuery alias)', () => {
const User = Support.sequelize.define('User', {
name: DataTypes.STRING,
age: DataTypes.INTEGER
},
{
freezeTableName: true
});
const Post = Support.sequelize.define('Post', {
title: DataTypes.STRING
},
{
freezeTableName: true
});
User.Posts = User.hasMany(Post, {foreignKey: 'user_id', as: 'postaliasname'});
expectsql(sql.selectQuery('User', {
table: User.getTableName(),
model: User,
attributes: ['name', 'age'],
include: Model._validateIncludedElements({
include: [{
attributes: ['title'],
association: User.Posts,
subQuery: true,
required: true
}],
as: 'User'
}).include,
subQuery: true
}, User), {
default: 'SELECT [User].*, [postaliasname].[id] AS [postaliasname.id], [postaliasname].[title] AS [postaliasname.title] FROM ' +
'(SELECT [User].[name], [User].[age], [User].[id] AS [id] FROM [User] AS [User] ' +
'WHERE ( SELECT [user_id] FROM [Post] AS [postaliasname] WHERE ([postaliasname].[user_id] = [User].[id]) LIMIT 1 ) IS NOT NULL) AS [User] ' +
'INNER JOIN [Post] AS [postaliasname] ON [User].[id] = [postaliasname].[user_id];',
mssql: 'SELECT [User].*, [postaliasname].[id] AS [postaliasname.id], [postaliasname].[title] AS [postaliasname.title] FROM ' +
'(SELECT [User].[name], [User].[age], [User].[id] AS [id] FROM [User] AS [User] ' +
'WHERE ( SELECT [user_id] FROM [Post] AS [postaliasname] WHERE ([postaliasname].[user_id] = [User].[id]) ORDER BY [postaliasname].[id] OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY ) IS NOT NULL) AS [User] ' +
'INNER JOIN [Post] AS [postaliasname] ON [User].[id] = [postaliasname].[user_id];'
});
});
}); });
suite('queryIdentifiersFalse', () => { suite('queryIdentifiersFalse', () => {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!