是否可以使用 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 【问题描述】:

我有两个表 UsersLists 我创建了一个关联第三个表(多对多),外键 Pivot 为 Editors。我想基于枢轴FK_Editors_User_IdLists 返回到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 相同的事务中运行

re模块,主要用来查询

Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据

使用 JPA 解析琐碎查询的语法错误

教义关系是否会影响应用程序性能?

是否可以通过 Spring Security 以编程方式进行身份验证并使其持久化?