DBIC 使っていたんですがなかなか使いこなせないですね。
PK::Auto で失敗
my $rec = $schema->resultset('t_test')->search(...)->first;
# うーむ,やっぱり新規で INSERT しよう
$rec->store_column('id', undef); # PrimaryKey を undef に
$rec->insert; # died!みたいなことをやってだめでした(NULL constraint どうのこうの)。undef を set するとフィールド値をセットしないかな,と思ったんですが,そうすると単に NULL をいれようとするだけっぽいです。
あこぎながら
delete $rec->{_column_data}{id};ということをやって応急処置。もちろんこういうことを常用してはいけないと思います。
$schema->resultset('t_test')->create(
{
'other_field1' => $rec->other_field1,
...
}
);とか。格好悪。
凝った UPDATE で失敗
$schema->resultset('t_test')->update(
{
field1 => 'field1 + 1',
}
);は,駄目でした(Integer field にいれられないよ)。まぁそれはそうだろ,という感じですが,なんとか直で SQL 書けないですかね。
JOIN で凝った条件を書いて失敗
実際には JOIN したというより,リレーション貼ってて prefetch で自動的に JOIN されたんですが,
$schema->resultset('t_parent')->search(
{
available => 1,
},
{
order_by => 'id',
prefetch => 't_child',
}
);みたいにすると,ambiguous identifier 'id' みたく怒られました。
SQL 文を吐くようにしてデバッグするとわかるんですが,こういう場合,主テーブルのテーブルには 'me' というエイリアスが指定されるので,
order_by => 'me.id',
とすればよいです。リレーション先のテーブルについては,リレーションの名前がつきます。どういうことかというと,
CD->belongs_to('artist' => 'Artist', 'artist_id');
$schema->resultset('CD')->search(
{
'artist.name' => { 'LIKE', 'M%' },
},
{
prefetch => 'artist',
},
);
みたいにすればよいということです。この Artist のテーブル名が t_artist だったとしても,上記でリレーションを「artist」という名前にしているので artist というエイリアスが貼られますから,「artist.ほにゃらら」でアクセスできます。