是否可以使用 findAll() 创建查询并通过使用来自 pivot 的 ForeignKey(关系多对多)获得过滤结果?
Posted
技术标签:
【中文标题】是否可以使用 findAll() 创建查询并通过使用来自 pivot 的 ForeignKey(关系多对多)获得过滤结果?【英文标题】:Is that possible to create query using findAll() and get filtered result by using ForeignKey from pivot (relation many-to-many)? 【发布时间】:2019-12-29 22:12:19 【问题描述】:我有两个表 Users
和 Lists
我创建了一个关联第三个表(多对多),外键 Pivot 为 Editors
。我想基于枢轴FK_Editors_User_Id
将Lists
返回到req.user.id
,然后在一个查询中获取所有其他editors
。当查询内部包含用户模型时,我可以使用 FK_Editors_User_Id
进行 where 查询,但是当我尝试在 List.findAll()
上执行 where 时,我会收到 there is no column in List.FK_Editors_User_Id
的错误。
是否可以在 List.findAll()
上创建查询并在某一时刻查询使用 all editors
获取过滤列表?
获取列表方法,该方法应返回编辑器可以编辑的所有过滤列表,每个列表返回所有当前其他编辑器。
List.findAll(
where:
'FK_EditorsLists_Users_Id': 2
,
attributes: [
'id',
'title',
'createdAt',
'updatedAt'
],
include: [
model: User,
required: true,
attributes: [
'id',
'lastName',
'firstName',
'userName',
'email'
]
]
)
但在这种情况下我不能使用FK_EditorsLists_Users_Id
,因为在List
模型中,sequalize 看不到表Editors
中的外键。如何将 FK 键添加到 List 模型,并且可以通过 FK_EditorsLists_Users_Id
找到
All results without any "where" filter
Scenerio 1: Logged in as Ammie should see only 1 list because she can edit only one list also she can see who can edit the list too
【问题讨论】:
【参考方案1】:一方面,我认为:您需要告知 sequelize 使用哪个关联。假设您的关联是这样的:
List.belongsToMany(User, as: 'list2User', through: Editors, foreignKey: 'list_id', targetKey: 'id' );
那么你的协会需要说:
List.findAll(
// ... other stuff ...
include: [
model: User,
required: true,
as: 'list2User' // critical!!
// ... other stuff ...
where : id : 2
]
)
我上面的示例将有助于用户 2 编辑的所有列表。但是,我认为,要让这些列表的所有编辑者都需要另一个关联。
【讨论】:
以上是关于是否可以使用 findAll() 创建查询并通过使用来自 pivot 的 ForeignKey(关系多对多)获得过滤结果?的主要内容,如果未能解决你的问题,请参考以下文章
Spring & Hibernate - 使本机查询在与@Transactional 相同的事务中运行
Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据