[CDBI] Has Many Problem

James Hargreaves james.hargreaves at gmail.com
Thu Nov 16 17:24:11 GMT 2006


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



More information about the ClassDBI mailing list