[Cologne-pm] DBIx::Class joins?!?
Michael Lamertz
mike at lamertz.net
Wed Jul 4 11:12:28 PDT 2007
Argh! Ich grok es einfach nicht. Ich sitz' jetzt seit Tagen (ok, immer
nur 'mal 'ne Stunde) ueber 'ner in SQL voellig trivialen Geschichte.
In DBIx::Class ist ja 'ne CD-Datenbank als Beispiel gewaehlt, und ich
baue mein Problem da einfach 'mal rein:
Angenommen, ich moechte zu den bestehenden Tables CD, Artist, Label,
wasauchimmer, noch 'ne Kategorie Genre einfuehren, wobei eine CD
durchaus mehrere Genres abdecken kann.
Dann hab' ich ja 'ne many_to_many Relationship zwischen Genre und CD,
und die realisier' ich ja ueber 'ne mapping-Table:
+-----+
|cd | +-----+ +-----+
+-----+ |map | |genre|
|id | <------------+ +-----+ +-----+
|title| +--------- |cd | +-------> |id |
|year | |genre| -----------+ |name |
|... | +-----+ +-----+
+-----+
Jetzt finde ich problemlos z.B. alle Techno-CDs von 1995 'raus, indem
ich sage
SELECT cd.title FROM cd, map, genre where
cd.year = 1997
AND map.cd = cd.id
AND map.genre = genre.id
AND genre.name = 'Techno'
oder als Join formuliert:
SELECT cd.title FROM cd
JOIN map ON map.cd = cd.id
JOIN genre ON map.genre = genre.id AND genre.name = 'Techno'
WHERE cd.year = 1995;
Kann mir das bitte einmal jemand exemplarisch als
DBIx::Class-search-Statement geben? Den ganzen belongs_to, has_many,
many_to_many-Kram hab' ich by the book aufgesetzt, aber many_to_many ist
ja laut doku eigentlich garkeine Relation, und ich bekomm' es einfach
nicht hin, egal wie ich es bisher gedreht habe :-/
Ich nehm' auch gerne einen Pointer in die Doku, obwohl ich die
mittlerweile rauf und runter gekaut habe.
Blaeh!
--
Michael Lamertz - Sandstr. 122 - 50226 Frechen
M: +49 171 6900310 / T: +49 2234 204947 / F: +49 2234 4358725
www.perl-ronin.de - www.fuss-und-hand.de - www.lamertz.net
mlamertz at perl-ronin.de - michael at fuss-und-hand.de - mike at lamertz.net
More information about the Cologne-pm
mailing list