NAME
DBIx::Class::SQLMaker::Role::SQLA2Passthrough - A test of future possibilities
SYNOPSIS
- •
-
select and group_by options are processed using the richer SQLA2 code
- •
-
expand_join_condition is provided to more easily express rich joins
See "examples/sqla2passthrough.pl" for a small amount of running code.
SETUP
(on_connect_call => sub {my ($storage) = @_;$storage->sql_maker->with::roles('DBIx::Class::SQLMaker::Role::SQLA2Passthrough');})
expand_join_condition
__PACKAGE__->has_many(minions => 'Blah::Person' => sub {my ($args) = @_;$args->{self_resultsource}->schema->storage->sql_maker->expand_join_condition($args);});
on
__PACKAGE__->has_many(minions => 'Blah::Person' => on {{ 'self.group_id' => 'foreign.group_id','self.rank' => { '>', 'foreign.rank' } }});
Or with ParameterizedJoinHack,
__PACKAGE__->parameterized_has_many(priority_tasks => 'MySchema::Result::Task',[['min_priority'] => sub {my $args = shift;return +{"$args->{foreign_alias}.owner_id" => {-ident => "$args->{self_alias}.id",},"$args->{foreign_alias}.priority" => {'>=' => $_{min_priority},},};}],);
becomes
__PACKAGE__->parameterized_has_many(priority_tasks => 'MySchema::Result::Task',[['min_priority'] => on {{ 'foreign.owner_id' => 'self.id','foreign.priority' => { '>=', { -value => $_{min_priority} } } }}]);
Note that foreign/self can appear in such a condition on either side, BUT if you want DBIx::Class to be able to use a join-less version you must ensure that the LHS is all foreign columns, i.e.
on {+{'foreign.x' => 'self.x','self.y' => { -between => [ 'foreign.y1', 'foreign.y2' ] }}}
is completely valid but DBIC will insist on doing a JOIN even if you have a fully populated row object to call "search_related" on - to avoid the spurious JOIN, you must specify it with explicit LHS foreign cols as:
on {+{'foreign.x' => 'self.x','foreign.y1' => { '<=', 'self.y' },'foreign.y2' => { '>=', 'self.y' },}}