使用DBIx :: Class自动更新相关行

时间:2018-01-24 19:17:15

标签: perl dbix-class

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

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

最终调用创建Artist的$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,但由于它明显被遗弃而保持警惕。

1 个答案:

答案 0 :(得分:1)

Ribasushi承诺如果有人加强并将其测试套件迁移到DBIC架构并提出了一个理智的API,因为他不喜欢RU当前如何处理这个问题,那么它就会使RecursiveUpdate功能成为核心。 Catalyst :: Controller :: DBIC :: API几年来一直在生产中使用RU以及HTML :: Formhandler :: Model :: DBIC,没有任何问题。

所以目前RecursiveUpdate是要走的路。