第一個功能是透過 scalar reference 做的,像是想要下:
UPDATE mytable SET viewnum = viewnum + 1 WHERE id = 123;
這樣的指令,那麼就用:
my $element = $c->model('MyDB')->find(123);
$element->update({viewnum => \'viewnum + 1'})
這個問題還蠻常在 DBIx::Class 的 mailing list 上被問,原因在於這是 SQL::Abstract 的範疇,所以沒仔細看完文件不太會知道這個用法。
第二個功能其實還蠻重要的,因為有些 complex operation 沒辦法放到 Trigger 時得在 Database Library 這層做,其實是個蠻常見的情況,但我找了不少說明文件都沒有提到解法。後來發現其實在 DBIx::Class::ResultSetManager 就有提供了,不過因為這個功能還是 EXPERIMENTAL,所以大多數的文件都沒有講。
我建議用自訂函數後要把 DBIx::Class 的 mailing list 訂起來看,之後的版本可能是以其他方式解決這個問題。