[Dbix-class] constructing a query where fields are compared to each other

Peter Rabbitson rabbit+dbic at rabbit.us
Thu Oct 17 11:13:17 GMT 2013


On Wed, Oct 16, 2013 at 05:39:12PM -0700, Karen Etheridge wrote:
> On Wed, Oct 16, 2013 at 08:13:34PM -0400, Rob Kinyon wrote:
> > It's good you showed all the code because the extended comparison in a
> > join relationship isn't possible. (It's one of ribasushi's many
> > in-progress branches. Patches most definitely welcome here.)
> > 
> > However, this is definitely possible in a search. You have to use the trapdoor.
> > 
> >     ->search({ 1 => \"me.field_x - me.field_y" });
> > 
> > That is a reference to a string.
> 
> A ha, so we drop down to literal SQL (via the scalar reference), but we
> can't do that in a join because we can't jam the $args->{foreign_alias}
> bits into the reference - it's then no longer literal SQL.

You can of course ;) You will have to forgive Rob, he has been out of 
the loop for a bit. The coderef-based relationship feature you correctly 
tried to use in your original email is what he meant by "one of 
ribasushi's branches", and that feature did land couple years ago.

The only thing you didn't do correctly was to use the coderef syntax 
where it is quite appropriate (there is a working draft for arbitrary OP 
expression *without* \'' business, but it will happen post Data::Query)

To answer your immediate question - you wanted:

__PACKAGE__->has_many(cats_dogs => 'MyApp::Schema::Dogs' =>
    sub {
        my $args = shift;
        \" $args->{foreign_alias}.field_x - $args->{foreign_alias}.field_y = 1";
    },
);

Cheers



More information about the DBIx-Class mailing list