1 package DBIx::Class::SQLMaker::Role::SQLA2Passthrough;
13 $args->{self_resultsource}
14 ->schema->storage->sql_maker
15 ->expand_join_condition(
24 around select => sub {
25 my ($orig, $self, $table, $fields, $where, $rs_attrs, $limit, $offset) = @_;
27 $fields = \[ $self->render_expr({ -list => [
29 map +(ref($_) eq 'HASH'
32 my $as = delete $f{-as};
34 my $func = +{ ($f =~ /^-/ ? $f : "-${f}") => $rhs };
36 ? +{ -op => [ 'as', $func, { -ident => [ $as ] } ] }
39 : $_), ref($fields) eq 'ARRAY' ? @$fields : $fields
42 if (my $gb = $rs_attrs->{group_by}) {
45 group_by => \[ $self->render_expr({ -list => $gb }, -ident) ]
48 $self->$orig($table, $fields, $where, $rs_attrs, $limit, $offset);
51 sub expand_join_condition {
52 my ($self, $cond, $args) = @_;
56 my $res = $orig->(@_);
57 my ($name, @rest) = @{$res->{-ident}};
58 if ($name eq 'self' or $name eq 'foreign') {
59 $res->{-ident} = [ $args->{"${name}_alias"}, @rest ];
64 my $sqla = $self->clone->wrap_op_expander(ident => $wrap);
65 $sqla->expand_expr($cond, -ident);
74 DBIx::Class::SQLMaker::Role::SQLA2Passthrough - A test of future possibilities
80 =item * select and group_by options are processed using the richer SQLA2 code
82 =item * expand_join_condition is provided to more easily express rich joins
86 See C<examples/sqla2passthrough.pl> for a small amount of running code.
90 (on_connect_call => sub {
93 ->with::roles('DBIx::Class::SQLMaker::Role::SQLA2Passthrough');
96 =head2 expand_join_condition
98 __PACKAGE__->has_many(minions => 'Blah::Person' => sub {
100 $args->{self_resultsource}
101 ->schema->storage->sql_maker
102 ->expand_join_condition(
109 __PACKAGE__->has_many(minions => 'Blah::Person' => on {
110 { 'self.group_id' => 'foreign.group_id',
111 'self.rank' => { '>', 'foreign.rank' } }
114 Or with ParameterizedJoinHack,
116 __PACKAGE__->parameterized_has_many(
117 priority_tasks => 'MySchema::Result::Task',
118 [['min_priority'] => sub {
121 "$args->{foreign_alias}.owner_id" => {
122 -ident => "$args->{self_alias}.id",
124 "$args->{foreign_alias}.priority" => {
125 '>=' => $_{min_priority},
133 __PACKAGE__->parameterized_has_many(
134 priority_tasks => 'MySchema::Result::Task',
135 [['min_priority'] => on {
136 { 'foreign.owner_id' => 'self.id',
137 'foreign.priority' => { '>=', { -value => $_{min_priority} } } }