【问题标题】:Automatically updating related rows with DBIx::Class使用 DBIx::Class 自动更新相关行
【发布时间】:2018-07-03 22:40:48
【问题描述】:

在 REST API 的上下文中,我一直在使用 DBIx::Class 创建相关行,即

POST /artist
{ "name":"Bob Marley", "cds":[{"title":"Exodus"}] }

最终调用$artist->new($data)->insert() 创建艺术家并在 CD 表中创建相关行。然后它将生成的对象发送回用户(通过DBIC::ResultClass::HashRefInflator),包括创建的主键和默认值。当用户对这些对象进行更改并将它们再次发送回 API 时,就会出现问题:

POST /artist/7
{ "name":"Robert Nesta Marley", "artistid":"7", 
  "cds":[{"title":"Exodus", "cdid":"1", "artistid":"7", "year":"1977"}] }

现在呢?从测试中我可以看出,DBIC::Row::update 不处理相关行的更改,因此在这种情况下,名称更改会起作用,但 CD 年份的更新不会。 DBIC::ResultSet::update_or_create 只需调用 DBIC::Row::update。所以我去寻找一些替代品,它们似乎确实存在,即DBIC::ResultSet::RecursiveUpdate,但它在 4 年内没有更新,并且对它的引用似乎表明它应该/将被折叠到 DBIC 中。那发生了吗?

我错过了一些更简单的东西吗?

显然,我可以处理这种特殊情况,但我有许多 API 需要编写,而且对所有这些 API 进行通用处理会更容易。我当然很想使用 RecursiveUpdate,但由于它明显被放弃了,所以我很谨慎。

【问题讨论】:

  • 当然你可以用你的 api 做各种各样的事情,它是你的。但请重新考虑您在第一行 REST-api 中所说的内容。是的,可以发布到 /artists,包括(整个)CD 列表。更常见的是,创建 CD,保存他们的 ID;创建艺术家并将 ID 从 CD 发布到 /artists/{artist_id}/cds。基本上:每件事都有自己的 URI,由单独的 POST 操作创建。编辑,对现有资源执行 PUT,而不是混合多个资源的 POST。我们尝试了“PATCH”,但那是另一回事。

标签: perl dbix-class


【解决方案1】:

Ribasushi 承诺,如果有人挺身而出,将其测试套件迁移到 DBIC 模式并提出一个健全的 API,他将把 RecursiveUpdate 功能作为核心,因为他不喜欢 RU 目前处理这个问题的方式。 Catalyst::Controller::DBIC::API 多年来一直在生产中使用 RU 以及 HTML::Formhandler::Model::DBIC,没有任何问题。

所以目前 RecursiveUpdate 是要走的路。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多