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'
},
}
}