[Dbix-class] prefetch problem

Ronald J Kimball rkimball at pangeamedia.com
Fri Aug 13 14:54:29 GMT 2010


On Fri, Aug 13, 2010 at 10:39 AM, Marc Perez <markkus.80 at gmail.com> wrote:
> I'm doing the next query:
> my $files = $catVar->model('cmsDB::Files')->search(
>                       {
>                               'me.cmsobj_id' => $this->cmsobj_id,
>                               -or => [mime_type => 'image/jpeg',mime_type =>
> 'image/gif',mime_type => 'image/png'],
>                               'fieldfiles.language_id' => $langId
>                       },
>                       {
>               join => 'fieldfiles',
>               prefetch => 'fieldfiles'
>                       }
>               );
>
> When I try to access the fieldfiles data:
>
> while( my $file = $files->next() ) {
> print($file->fieldfiles->name)
> }
>
> I get the error:
> Can't locate object method "name" via package "DBIx::Class::ResultSet"

Because "fieldfiles" is a has_many relationship, calling the accessor
in scalar context returns a resultset object, not a row object.  You
probably want to do one of these:

while (my $file = $files->next) {
  my $fieldfiles = $file->fieldfiles;
  while (my $fieldfile = $fieldfiles->next) {
    print $fieldfile->name;
  }
}

while (my $file = $files->next) {
  foreach my $fieldfile ($file->fieldfiles) {
    print $fieldfile->name;
  }
}

You could also do something like this:

while (my $file = $files->next) {
  print join ", ", $file->fieldfiles->get_column('name')->all;
}

Ronald



More information about the DBIx-Class mailing list