use strict; use warnings; package MySchema::Result::A; use parent 'DBIx::Class::Core'; __PACKAGE__->table('a'); __PACKAGE__->add_columns( id => { data_type => 'INT', is_auto_increment => 1 } ); __PACKAGE__->set_primary_key('id'); __PACKAGE__->has_many( b => 'MySchema::Result::B' ); package MySchema::Result::B; use parent 'DBIx::Class::Core'; __PACKAGE__->table('b'); __PACKAGE__->add_columns( id => { data_type => 'INT', is_auto_increment => 1 }, a => { data_type => 'INT' }, ); __PACKAGE__->set_primary_key('id'); __PACKAGE__->belongs_to( a => 'MySchema::Result::A' ); __PACKAGE__->has_many( c => 'MySchema::Result::C' ); package MySchema::Result::C; use parent 'DBIx::Class::Core'; __PACKAGE__->table('c'); __PACKAGE__->add_columns( b => { data_type => 'INT' }, x => { data_type => 'INT' }, ); __PACKAGE__->set_primary_key( 'b', 'x' ); __PACKAGE__->belongs_to( b => 'MySchema::Result::B' ); package MySchema; use parent 'DBIx::Class::Schema'; __PACKAGE__->load_classes( { 'MySchema::Result' => [qw< A B C >] } ); package main; my $schema = MySchema->connect('dbi:SQLite::memory:'); $schema->deploy(); my $a = $schema->resultset('A')->create( {} ); my $b = $a->create_related( b => {} ); $b->create_related( c => { x => 1000 + $_ } ) for 1 .. 3; my $c = $a->search_related('b')->search_related('c'); $c->count(); # uses 1 level JOIN on table 'b' $c->get_column('x')->all; # uses 2 level JOIN on table 'c' $c->delete(); # fetches and enumerates PKs $b->search_related('c')->delete(); # 1st level relationship works as expected