[Dbix-class] Multi-table join problems

Dan Horne dan.horne at redbone.co.nz
Thu Jul 9 23:19:18 GMT 2009


Hi

I have a structure like the one below - ep_config has many ep_sections  
which in turn has man ep_process_runs:

+----------------+        +-----------------+     +-----------------+
| ep_config      |        | ep_section      |     | ep_process_run  |
|                |       /|                 |    /|                 |
| config_id (PK) |--------|-section_id (PK) |-----| process_id (PK) |
| config_name    |       \| config_id (FK)  |    \| section_id (FK) |
|                |        |                 |     |                 |
+----------------+        +-----------------+     +-----------------+

I want to find all ep_process_runs where I know the config_name. I've  
tried the following:

my $rs = $schema->resultset('ETL::Pipeline::Schema::EpProcessRun')- 
 >search(
     {
         'config_name' => $config_name
     },
     {
         join => {'section_id' => 'config_id'},
         order_by => 'config_name'
     }
);

which gives the error: Can't locate object method "config_id"

I tried changing the condition to specify the table_name

'ep_config.config_name' => $config_name

DBIx::Class::ResultSet::next(): DBI Exception: DBD::Oracle::db  
prepare_cached failed: ORA-00904: "EP_CONFIG"."CONFIG_NAME": invalid  
identifier (DBD ERROR: error possibly near <*> indicator at char 301  
in 'SELECT me.process_id, me.section_id, me.status_id, me.session_id,  
me.message, me.os_process_id, me.date_created, me.date_updated FROM  
ep_process_run me  JOIN ep_section section_id ON section_id.section_id  
= me.section_id  JOIN ep_config config_id ON config_id.config_id =  
section_id.config_id WHERE ( <*>ep_config.config_name = :p1 ) ORDER BY  
config_name') [for Statement "SELECT me.process_id, me.section_id,  
me.status_id, me.session_id, me.message, me.os_process_id,  
me.date_created, me.date_updated FROM ep_process_run me  JOIN  
ep_section section_id ON section_id.section_id = me.section_id  JOIN  
ep_config config_id ON config_id.config_id = section_id.config_id  
WHERE ( ep_config.config_name = ? ) ORDER BY config_name"] at /home/ 
dhorne/adhoc/test.pl line 33


and I tried the condition

'config_id.config_name' => $config_name

which gives

Can't locate object method "config_id"

The schema was reverse engineered sing DBIx::Class::Schema::Loader,  
and it names all belongs_to relationships using the column name  
specified in the FK/PK relationship. E.g. in  
ETL::Pipeline::Schema::EpSection it is defined as

__PACKAGE__->belongs_to(
   "config_id",
   "ETL::Pipeline::Schema::EpConfig",
   { config_id => "config_id" },
);

The database is Oracle 11

Any help appreciated

Dan





-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20090710/781ec378/attachment.htm


More information about the DBIx-Class mailing list