2008-01-05 11:35:22

DBICでLEFT JOIN

[DBIx::Class]

from アトリビュートを使用する。
http://search.cpan.org/~ash/DBIx-Class-0.08008/lib/DBIx/Class/ResultSet.pm#from

belongs_to を使用してリレーションしていると
普通の join (INNER JOIN) となる。
場合によって、left join を使用しなければならない時、
以下のように from アトリビュートを使用する。

my $it = $schema->resultset('Goods')->search(
 {
  'stock.quantity' => {is => undef},
 },
 {
  columns => [qw/goods_id/],
  from => [
   { me => 'goods' }, #ここで goods テーブルを指定するのがポイント
   [
    { stock => 'stock', -join_type => 'left' },
    { 'stock.goods' => 'me.goods_id' }
   ],
  ],
 }
);

これで
SELECT me.goods_id FROM goods me LEFT JOIN stock stock ON ( stock.goods = me.goods_id ) WHERE ( stock.quantity IS NULL );
となる。

どんなSQLが発行されているかは DBIC_TRACE をオンにすると見ることが出来る。
$ENV{DBIC_TRACE} = 1;
ex) http://www.rwds.net/wiki?page=DBIx%3A%3AClass%A4%CE%B3%D0%BD%F1