【问题标题】:Filtering bidirectional relationship in CRNK在 CRNK 中过滤双向关系
【发布时间】:2020-03-03 12:57:19
【问题描述】:

我正在玩 crnk 试图推断我在文档中找不到的位。我将在标准 crnk 示例中解释我的问题:https://github.com/crnk-project/crnk-framework/tree/master/crnk-integration-examples/spring-boot-example

项目和任务之间存在一对多的关系(其他资源不相关)。如果我理解正确(该示例使用显然已弃用的opposite@JsonApiRelation 参数),则关系的所有者是 1Task.project1。我现在想列出按相关资源的某些属性过滤的资源。例如。这按预期工作(从响应中留下一些不重要的位):

GET http://127.0.0.1:8080/api/tasks?filter[project.id]=121

{
  "data" : [ {
    "id" : "1",
    "type" : "tasks",
    "links" : {
      "self" : "http://127.0.0.1:8080/api/tasks/1"
    },
    "attributes" : {
      "name" : "Create tasks",
      "description" : null
    },
    "relationships" : {
      "project" : {
        "data" : {
          "id" : "121",
          "type" : "projects"
        }
    }
  } ]
}

但是反方向的过滤是不可能的:

GET http://127.0.0.1:8080/api/projects?filter[tasks.id]=1

{
  "data" : [ ]
}

这是在资源设置下预期的吗(见上面的链接)?如果是,必须做什么才能使过滤在两个方向上都起作用?

【问题讨论】:

    标签: rest json-api crnk


    【解决方案1】:

    目前这是存储库必须处理的事情,一种方法是使 getter/setter 成为双向的,因此 Task.setProject 会将自身添加到 Project.tasks。

    恕我直言,我认为这是存储库应该处理的东西,而不是 crnk 引擎中的内置东西。从 REST 角度来看,资源的 POST/PATCH/DELETE 不应触及相关资源。这将推迟对存储库的责任以进行这些查找。但也许有一些内置支持内存处理的可能性。问题出现在内存存储库中。例如,在 JPA 案例中,SQL 会处理它(这也可以提供一个为此提供解决方案的路径)。

    【讨论】:

    • 你可能是对的。今天我在深入挖掘代码并意识到框架的设计方式是repository.findAll负责获取和过滤数据的整个操作。因为在我的示例中 projects 存储库根本不知道 tasks 我得到空结果。
    • 还确认使用 JPA 存储库它可以按预期工作,例如在时间表和创建者之间,如github.com/crnk-project/crnk-framework/tree/master/…
    • 另一方面,我仍然认为引擎可以以某种方式处理这种情况,因为乍一看它似乎与当前可使用lookUp@JsonApiRelationId 等配置的整个关系处理非常相似。例如类似“如果对面也有过滤,请查询相应的存储库”。尽管我在这里感觉到它在概念上比执行包含要困难得多,因为您只是在丰富数据,而使用过滤器,引擎确实必须在存储库级别实现某种连接......
    • 关于“从 REST 的角度来看,资源的 POST/PATCH/DELETE 不应触及相关资源。”:我认为整个双向性概念在某种程度上违背了 REST,因为如果您更新拥有方的关系,例如通过 POST 到 /tasks 将任务分配给项目,该任务也将在项目资源中可见。还是您对情况有不同的看法?
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2012-11-03
    • 2012-05-16
    • 1970-01-01
    • 2016-12-05
    • 2014-07-23
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多