[CDBI] Has Many Problem

James Hargreaves james.hargreaves at gmail.com
Thu Nov 16 17:25:27 GMT 2006


Just for the record, it DOES stringify the object when using it as a
key to the hash. But I guess I would have known that, had I thought
about it :)

On 16/11/06, James Hargreaves <james.hargreaves at gmail.com> wrote:
> Thanks Oli - that's kind of what I did eventually, except I wasn't
> sure if the fixture object would be maintained if it was used as the
> key to a hash? Would this not attempt to stringify it?
>
> Anyway, the code I have used for the moment is:
>
> sub fixtures
> { my $s = shift;
>
>  my $fixtures;
>  foreach my $f ($s->home_fixtures)
>  { $fixtures->{$f->id} = $f unless defined $fixtures->{$f->id};
>  }
>
>  foreach my $f ($s->away_fixtures)
>  { $fixtures->{$f->id} = $f unless defined $fixtures->{$f->id};
>  }
>
>  return values %$fixtures;
> }
>
> Thanks for your suggestion - I can see that this might not be
> considered a bug, just a decision by the designer. I *think* I would
> have decided the other way though...
>
> Cheers
> Jay
>
> On 16/11/06, Oliver Jeeves <oj at defuturo.co.uk> wrote:
> > James Hargreaves wrote:
> > > Hi everyone!
> > >
> > > I have two tables called fixtures and teams. A Fixture has a home_team
> > > and an away_team and hence:
> > >
> > > has_a(home_team => 'MyPackage::Team');
> > > has_a(away_team => 'MyPackage::Team');
> > >
> > > Hence a team has a list of fixtures:
> > >
> > > has_many(fixtures => 'MyPackage::Fixture');
> > >
> > > But this only returns the HOME fixtures. So I changed this to:
> > >
> > > has_many(home_fixtures => 'MyPackage::Fixture', 'home_team');
> > > has_many(away_fixtures => 'MyPackage::Fixture', 'away_team');
> > >
> > > sub fixtures
> > > { my $s = shift;
> > >  my @home_fixtures = $s->home_fixtures;
> > >  my @away_fixtures = $s->away_fixtures;
> > >  return ( @home_fixtures, @away_fixtures );
> > > }
> > >
> > > Which returns what I want, if in a rather naff way! However, I have
> > > some fixtures where the same team is entered for both home_team and
> > > away_team fields (for when the opposition is T.B.C). In this case the
> > > fixture is returned twice!
> > >
> > > Is there an easy way around this other than modifying my fixtures sub?
> > > I note that the following causes an error:
> > >
> > > has_many(fixtures => 'MyPackage::Fixture', 'home_team', 'away_team');
> > >
> > > This seems like a reasonable syntax for this situation? Though to be
> > > honest I would have thought the standard syntax would return the
> > > result set I want? The addition of a foreign key as the third
> > > parameter keys would then be used to select only home/away fixtures.
> > >
> > > Any help would be appreciated!
> > >
> > > Thanks
> > > Jay
> > >
> >
> > CDBI is certainly not without its problems (cue MST), but I don't
> > consider anything you've mentioned to actually be a problem.
> >
> > Given two relationships, I think it's a reasonable assumption that a
> > user of the class would only want the results of one of them at a time,
> > simply because there are two seperate relationships, not one.
> >
> > The solution to your problem, is to re-write your fixtures sub. I'd do
> > it like this:
> >
> > sub fixtures
> > {
> >         my $self = shift;
> >         my %fixtures = map {$_ => 1}
> >                 ($self->home_fixtures, $self->away_fixtures);
> >
> >         return keys %fixtures;
> > }
> >
> > That's just off the top of my head, I haven't tested it.
> >
> > -Oli
> >
> >
> >
> >
>
>
> --
> Bingo, bango, boshthedog.com
>


-- 
Bingo, bango, boshthedog.com



More information about the ClassDBI mailing list