[Dbix-class] Relationship condition problem.

Anthony Hinsinger anthony.hinsinger at univ-pau.fr
Thu Nov 23 14:10:42 GMT 2006


Hello,

i've a problem to define a relationship between two tables where the 
join condition need an operator different than '='.

The idea of the db design is (i'm using postgresql) :
TABLE networks => VARCHAR name, CIDR net
TABLE ips => INET addr, VARCHAR hostname
* CIDR is a type to define a network (for exemple 192.168.1.0/24)
* INET is a type to define an IP address (for exemple 192.168.1.37)
* with pgsql, you can use the '<<=' operator to know if an INET is 
inside of a CIDR.

i'd like to select all ips, and for each, the associated network name.
With SQL i can (successfully) use this request :
"SELECT ips.addr, networks.name FROM ips INNER JOIN networks ON ips.addr 
<<= networks.net;"

as you can see, the join condition is "ips.addr <<= networks.net"

In the documentation (DBIx::Class::Relationship::Base) i saw that :
"The condition needs to be an SQL::Abstract 
<http://search.cpan.org/perldoc?SQL%3A%3AAbstract>-style representation 
of the join between the tables"

so, into my schema module i tried this :
__PACKAGE__->add_relationship("network", "Networks", { 'foreign.net' => 
{ '<<=', 'self.addr'}  } );
to force an operator other than 'equal', but it don't work, because the 
condition key/value is check (into ResultSource.pm, function 
resolve_condition) and it doesn't like an hash ref as the value (because 
it check directly if the scalar contains foreign or self keywords).

Any idea how i can describe this "simple" join condition with DBIx::Class ??
The only thing missing (i think) is to force the condition operator ...

Thank you for helps

Anthony Hinsinger.
Universite de Pau - France




More information about the Dbix-class mailing list