Schrift
[thread]10446[/thread]

DBIx::Class -> has_many und belongs_to

Leser: 1


<< >> 9 Einträge, 1 Seite
bloonix
 2007-09-23 15:20
#99880 #99880
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

vielleicht kann mir jemand bei einem Verständnisproblem mit der
Funktion belongs_to() und foreign.key und self.key weiterhelfen.
In dem sehr einfachen Beispiel möchte ich gerne mit dem Aufruf
von belongs_to() in BloonixDB::UserGroup die Spaltennamen als
drittes Argument mitgeben.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE user (
id SERIAL PRIMRAY KEY,
username VARCHAR(200) UNIQUE,
password VARCHAR(200),
locked BOOLEAN DEFAULT 1,
email VARCHAR(200)
);

CREATE TABLE group (
id SERIAL PRIMARY KEY,
groupname VARCHAR(24) UNIQUE,
description VARCHAR(200)
);

CREATE TABLE user_group (
user_id INTEGER REFERENCES user(id),
group_id INTEGER REFERENCES group(id),
PRIMARY KEY(user_id, group_id)
);


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package BloonixDB::User;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('user');
__PACKAGE__->add_columns(qw/id username password locked email/);
__PACKAGE__->set_primary_key(qw/id/);
__PACKAGE__->has_many('user_groups', 'BloonixDB::UserGroup', { 'foreign.user_id' => 'self.id' });

package BloonixDB::Group;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('group');
__PACKAGE__->add_columns(qw/id groupname description/);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many('user_groups', 'BloonixDB::UserGroup', { 'foreign.group_id' => 'self.id' });

package BloonixDB::UserGroup;

__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('user_group');
__PACKAGE__->add_columns(qw/user_id group_id/);
__PACKAGE__->belongs_to('users', 'BloonixDB::User', { 'foreign.user_id' => 'self.id' });
__PACKAGE__->belongs_to('groups', 'BloonixDB::Group', { 'foreign.group_id' => 'self.id' });

1;


Nun ist meine Frage, ob die belongs_to() Definition so richtig ist?
Weiß hier jemand auch wie ich die Spalte UNIQUE einbinde?

Viele Grüße,
bloonix
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-09-23 17:01
#99881 #99881
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst bei belongs_to

'foreign.id' => 'self.user_id' bzw. 'foreign.id' => 'self.group_id' verwenden. In der "fremden" (foreign) Tabelle heißt es die Spalte ja jeweils "id" und in der Tabelle, für die das belongs_to definiert wird (self) "user_id" bzw. "group_id"
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-09-23 17:02
#99882 #99882
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Der Titel würde besser "DBIx::Class ..." statt "Catalyst ..." heißen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-09-23 17:16
#99884 #99884
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Renee,

danke für die Antwort. So habe ich das auch in einigen Examples
gelesen, was ich aber dann nicht so ganz verstehe ist, warum es

foreign.id

heißt, denn "id" ist in den Tabellen "user" und "group" ein Primär-
schlüssel und kein Fremdschlüssel. Der Fremdschlüssel liegt
in der Tabelle user_group.

Vielleicht verstehe ich die beiden Bedeutungen "Primary Key" und
"Foreing Key" auch falsch. Laut Wikipedia heißt es:

Quote
Primärschlüssel: Ein ausgewählter Schlüsselkandidat. Die Werte dieses Schlüssels
können in einer anderen Tabelle als Fremdschlüssel verwendet werden.


Das heißt doch, das id der Primärschlüssel und user_id in der fremden Tabelle
der Fremdschlüssel ist.

Quote
Fremdschlüssel: Ein Attribut oder eine Attributkombination einer Relation, welches auf
einen Primärschlüssel (bzw. Schlüsselkandidat) einer anderen oder der gleichen Relation
verweist. Ein Fremdschlüssel in einer Relation R ist in aller Regel kein Schlüssel im
engeren Sinne für diese Relation. Es handelt sich aber um einen Sekundärschlüssel.


Das soll doch heißen, dass user_id in der Tabelle user_group das Attribut Fremdschlüssel
erhält und auf den Primärschlüssel id in der Tabelle user referenziert.

Aber warum es dann in belongs_to() foreign.id heißt, verstehe ich nicht. Sollte es nicht
primary.id und self.user_id heißen? Denn ein Fremdschlüssel muss nicht UNIQUE sein.

Erleuchte mich :-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-09-23 17:18
#99885 #99885
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
"foreign" steht nicht für "FOREIGN KEY" sondern für "foreign table", also für die "andere Tabelle", mit der man die Verbindung herstellen möchte...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-09-23 17:21
#99886 #99886
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Okay, das erklärt einiges. Dazu muss ich aber schreiben,
dass es eine wirklich misslungene Benutzung des Wortes
"Foreign" ist. :/

Das hat mich ziemlich durcheinander gebracht.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2007-09-23 17:23
#99887 #99887
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
+---------+
| foreign |
+---------+
| id (PK) |
| col1 |
+---------+

+---------+
| self |
+---------+
| sid |
| fid (FK) |
+---------+


Code (perl): (dl )
1
2
3
4
5
package MyDB::ForeignTable;

#....

__PACKAGE__->has_many( 'selfs' => 'MyDB::SelfTable', {"foreign.fid" => "self.id"});


Code (perl): (dl )
1
2
3
4
5
package MyDB::SelfTable;

#...

__PACKAGE__->belongs_to( 'foreign' => 'MyDB::ForeignTable', {'foreign.id' => 'self.fid'});
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-09-23 17:24
#99888 #99888
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
bloonix+2007-09-23 15:21:40--
Okay, das erklärt einiges. Dazu muss ich aber schreiben,
dass es eine wirklich misslungene Benutzung des Wortes
"Foreign" ist. :/

Das hat mich ziemlich durcheinander gebracht.


Ja, das kann man durchaus so sehen... Wenn man aber in Klassen denkt, passt es wieder.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-09-23 17:39
#99889 #99889
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
*zipp*

Soweit habe ich es dann verstanden. Danke :-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 9 Einträge, 1 Seite



View all threads created 2007-09-23 15:20.