DBIx :: Class从另一个表更新一个表

时间:2012-10-29 10:41:32

标签: mysql dbix-class

我有一个SQL查询,可以直接在MySQL中正常工作,但是我很难将其转换为使用DBIx :: Class,我在这里简化了查询

UPDATE table1, table2
    SET table1.field1 = SOMEFUNC( table1.field4 / table2.field2 )
    WHERE table1.id = table2.id
        AND table1.field3 = table2.field3
        AND table2.field2 IS NOT NULL
        AND table2.field2 > 0;

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

在类似情况下,我通常会在相关表格上执行搜索。在您的情况下,您有两个结果来源: table1 table2 table1 与表 table2 (最有可能)名为 table2 的表有关系。现在,您使用此关系 table2 table2 中执行搜索。

my $resultset = $schema->resultset('table1')->search_rs(
   {
      me.field3 => table2.field3,
      table2.field2 => {'!=', '' },
      table2.field2 > 0
   },
   {
      'join' => 'table2',
      'select' => ['me.field1', 'me.field4', 'table2.field2', 'me.field4' / 'table2.field2' ],
      'as' => ['field1','field4', 'field2', 'division_result']
   }
);

while ( my $this_res_row = $resultset->next ) {
   ## Presuming somefunc is a perl subroutine
   $this_res_row->update( { field1 => somefunc( $this_res_row->get_column('division_result') ) } );
}

也许这是你提出的解决方案,我认为在单个dbic update()语句中不可能做你想要的。不幸的是,每个update()语句都会单独命中你的数据库。

顺便说一句,我不认为通过 field3 在同一张桌子上建立第二个联盟是个好主意,你已经通过 id 完成了它领域。你为什么还需要另一个?

或者,我认为最好的办法是使用数据库触发器来实现代码。

请注意,我没有测试过代码,但可能包含一些错误,但你必须掌握如何获得你想要的东西。

答案 1 :(得分:0)

使用* _related方法怎么样?