使用 DBIx::Class 自动更新相关行
Automatically updating related rows with DBIx::Class
在 REST API 的上下文中,我一直在使用 DBIx::Class 来创建相关行,即
POST /artist
{ "name":"Bob Marley", "cds":[{"title":"Exodus"}] }
最终调用 $artist->new($data)->insert()
创建艺术家并在 CD table 中创建相关行。然后它将生成的对象发回给用户(通过 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 年没有更新了,而且对它的引用似乎暗示它 should/would 被折叠到 DBIC .那件事发生了吗?
我是不是漏掉了一些更简单的东西?
显然,我可以处理这种特殊情况,但我有很多 API 需要编写,并且对所有这些都进行通用处理会更容易。我当然很想使用 RecursiveUpdate,但由于它明显被遗弃而保持警惕。
Ribasushi 承诺,如果有人加强并将其测试套件迁移到 DBIC 模式并提出一个合理的 API,Ribasushi 将以 RecursiveUpdate 功能为核心,因为他不喜欢 RU 当前处理此问题的方式。
Catalyst::Controller::DBIC::API 在幕后使用 RU 以及 HTML::Formhandler::Model::DBIC 多年来一直在生产中使用,没有任何问题。
所以目前 RecursiveUpdate 是可行的方法。
在 REST API 的上下文中,我一直在使用 DBIx::Class 来创建相关行,即
POST /artist
{ "name":"Bob Marley", "cds":[{"title":"Exodus"}] }
最终调用 $artist->new($data)->insert()
创建艺术家并在 CD table 中创建相关行。然后它将生成的对象发回给用户(通过 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 年没有更新了,而且对它的引用似乎暗示它 should/would 被折叠到 DBIC .那件事发生了吗?
我是不是漏掉了一些更简单的东西?
显然,我可以处理这种特殊情况,但我有很多 API 需要编写,并且对所有这些都进行通用处理会更容易。我当然很想使用 RecursiveUpdate,但由于它明显被遗弃而保持警惕。
Ribasushi 承诺,如果有人加强并将其测试套件迁移到 DBIC 模式并提出一个合理的 API,Ribasushi 将以 RecursiveUpdate 功能为核心,因为他不喜欢 RU 当前处理此问题的方式。 Catalyst::Controller::DBIC::API 在幕后使用 RU 以及 HTML::Formhandler::Model::DBIC 多年来一直在生产中使用,没有任何问题。
所以目前 RecursiveUpdate 是可行的方法。