内连接在 loopback 4 中不可用
Inner join not available in loopback 4
关联已正确设置且代码正在运行,但我正在为我想要的连接类型而苦苦挣扎。
编写以下代码仅获取那些用户 ID 为 [260, 123] 的地址。
const addresses = await this.addressRepository.find({
include: [{
relation: 'users',
scope: {
where: { id: { inq: [260, 123] } }
}
}]
})
但我得到的是,所有带有 where
过滤器的地址仅应用于作为左连接工作的用户。
请根据我的需要帮助我查询。
目前,LB4 不支持 SQL 内部联接 (https://github.com/strongloop/loopback-next/issues/4299)。
带有实例的示例和对关系的简单参考将帮助我们理解您要完成的工作、当前输出是什么以及预期输出是什么。
我猜这个关系是 **Address -> hasMany -> User
实例:
addresses = [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }];
users = [
{ id: 0, addressId: 0 },
{ id: 1, /* no address */ },
{ id: 2, addressId: 1 }, // same as id 260
{ id: 260, adressId: 1 },
{ id: 123, addressId:2 }
];
预期结果:
[
{ id: 1, users: [{ id: 260 }] }
{ id: 2, users: [{ id: 123 }] },
]
实际结果:
[
{ id: 0, users: [] } // filtered out user with id = 0
{ id: 1, users: [{ id: 260 }] } // filtered out user with id = 2
{ id: 2, users: [{ id: 123 }] },
{ id: 3, users: [] }
]
因此您的查询不会根据关系用户及其用户 ID(或 inner join)过滤 Addresses,而是查询父级基于当前 'where' 过滤器(匹配所有)的模型(地址),只是从包含关系中过滤掉用户。
解决方法 1
一种解决方法是添加 User -> BelongsTo -> Address 关系并使用反向查询:
const users = await this.userRepository.find({
where: {id: {inq: [260, 123]}},
include: [{
relation: 'address',
}],
});
// now you only have to reduce the final users with their addresses into unique addresses.
注意:不要忘记更新 UserRelations 因为 belongsTo 关系不会自动添加:
export interface UserRelations {
// describe navigational properties here
address?: AddressWithRelations;
}
解决方法 2
当然,另一种解决方法是将 userIds 的列表保留在地址中,并根据该 属性 进行查询。显然,这样做的缺点是,当您更新用户时,您必须同时更新相应的地址。
您好,如果您只使用一个 postgres 数据源来处理我们正在处理的相关查询:https://github.com/Wikodit/loopback-connector-postgresql
它允许像这样的内连接查询:
{
"where": {
"user.contact.email": "mail@domain.tld",
"profile.name": "support"
},
"include": [
{
"relation": "user",
"scope": {
"include" : [
{
"relation": "contact"
}
]
}
},
{
"relation": "profile"
}
],
"order": "user.contact.email ASC"
}
关联已正确设置且代码正在运行,但我正在为我想要的连接类型而苦苦挣扎。
编写以下代码仅获取那些用户 ID 为 [260, 123] 的地址。
const addresses = await this.addressRepository.find({
include: [{
relation: 'users',
scope: {
where: { id: { inq: [260, 123] } }
}
}]
})
但我得到的是,所有带有 where
过滤器的地址仅应用于作为左连接工作的用户。
请根据我的需要帮助我查询。
目前,LB4 不支持 SQL 内部联接 (https://github.com/strongloop/loopback-next/issues/4299)。
带有实例的示例和对关系的简单参考将帮助我们理解您要完成的工作、当前输出是什么以及预期输出是什么。
我猜这个关系是 **Address -> hasMany -> User
实例:
addresses = [{ id: 0 }, { id: 1 }, { id: 2 }, { id: 3 }];
users = [
{ id: 0, addressId: 0 },
{ id: 1, /* no address */ },
{ id: 2, addressId: 1 }, // same as id 260
{ id: 260, adressId: 1 },
{ id: 123, addressId:2 }
];
预期结果:
[
{ id: 1, users: [{ id: 260 }] }
{ id: 2, users: [{ id: 123 }] },
]
实际结果:
[
{ id: 0, users: [] } // filtered out user with id = 0
{ id: 1, users: [{ id: 260 }] } // filtered out user with id = 2
{ id: 2, users: [{ id: 123 }] },
{ id: 3, users: [] }
]
因此您的查询不会根据关系用户及其用户 ID(或 inner join)过滤 Addresses,而是查询父级基于当前 'where' 过滤器(匹配所有)的模型(地址),只是从包含关系中过滤掉用户。
解决方法 1
一种解决方法是添加 User -> BelongsTo -> Address 关系并使用反向查询:
const users = await this.userRepository.find({
where: {id: {inq: [260, 123]}},
include: [{
relation: 'address',
}],
});
// now you only have to reduce the final users with their addresses into unique addresses.
注意:不要忘记更新 UserRelations 因为 belongsTo 关系不会自动添加:
export interface UserRelations {
// describe navigational properties here
address?: AddressWithRelations;
}
解决方法 2
当然,另一种解决方法是将 userIds 的列表保留在地址中,并根据该 属性 进行查询。显然,这样做的缺点是,当您更新用户时,您必须同时更新相应的地址。
您好,如果您只使用一个 postgres 数据源来处理我们正在处理的相关查询:https://github.com/Wikodit/loopback-connector-postgresql
它允许像这样的内连接查询:
{
"where": {
"user.contact.email": "mail@domain.tld",
"profile.name": "support"
},
"include": [
{
"relation": "user",
"scope": {
"include" : [
{
"relation": "contact"
}
]
}
},
{
"relation": "profile"
}
],
"order": "user.contact.email ASC"
}