Posts Tagged ‘fey’

A note about fey

Wednesday, June 17th, 2009

I am in the process of transitioning a DBIx::Class application to Fey abd Fey::ORM. I must say Fey::ORM is more comfortable than DBIC.

Fey is a framework for representing database schemas and generating queries from that representation. Fey::ORM is a SQL-lovers object-relational mapping built on top of Fey’s impressive SQL generation capabilities.

I do mean impressive, as Fey is able to infer join conditions entirely on its own:

# A User has many units, and units have many users, via the lnk_unit_users table.

my $unit_users = $schema->table('lnk_unit_users');
my $unit       = $schema->table('lkup_unit');

my $select_units = $factory->new_select
    ->select($unit)
    ->from($unit, $unit_users)
    ->where($unit_users->column('user_id'), '=', Fey::Placeholder->new)
;

has_many 'units' => (
    table       => $unit,
    select      => $select_units,
    bind_params => sub { $_[0]->user_id },
);

So, when I go $user->units, I get an iterator object full of Units, which executes the following sql:

SELECT *
    FROM lkup_unit 
    JOIN lnk_unit_users ON (lnk_unit_users.unit_id = lkup_unit.unit_id) 
    WHERE lnk_unit_users.user_id = ?

Note, in my $select_units query I did not specify the join condition, I merely passed two Fey::Table objects, and using the foreign key constraints Fey figured out what to do.

I think this is pretty cool. :)