Schrift
[thread]13008[/thread]

DBIx::Class - Weitere Spalten in Relationstabellen

Leser: 2


<< >> 4 Einträge, 1 Seite
Cremator
 2009-01-16 11:07
#118061 #118061
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Moin!

Ich versuche mich grade ein erstes mal an DBIx::Class bzw. Catalyst und bin dabei auf ein Problem gestossen das in keiner Doku die mir bisher untergekommen ist behandelt wird. Wie komme ich an Daten ran die zusätzlich zu den IDs in Relationstabellen abgespeichert sind, bzw. wie bekomme ich diese erstmal in die DB?

Folgende Tabellen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
groesse:
id INT auto_increment PK
name char

ding:
id INT auto_increment PK
name char

map:
id_ding INT # FK aus Tab ding
id_groesse INT # FK aus Tab groesse
preis FLOAT

Größen sind bereits vorhanden bevor Dinge gespeichert werden können. Wenn jetzt ein neues Ding erzeugt wird, soll es möglich sein für die verschiedenen Größen unterschiedliche Preise einzugeben. Das Formular hab ich schon, in der Relationstabelle wird auch ein neuer Eintrag erzeugt, aber die zusätzliche Spalte enthält keine Daten. Code in Catalyst von dem ich dachte das er gehen würde (wenn ich mich in der Doku zu Resultset nicht verlesen habe):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my $ding = $c->model('Db::Ding')->create({
    name       => $form->param('name'),
    groesse    => [
        { id_groesse => $form->param('id_groesse_1'), preis => $form->param('preis_groesse_1') },
        { id_groesse => $form->param('id_groesse_2'), preis => $form->param('preis_groesse_2') },
        # etc für die weiteren größen
    ],
});
$ding->update();

Oder ist sowas in DBIx grundsätzlich nicht vorgesehen? Das wäre ja ganz schön mistig :(
Cremator
 2009-01-16 12:43
#118076 #118076
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
Jetzt wird's richtig seltsam... Habe grade mal das Tracing aktiviert um mir die generierten SQL-Statements anzuschauen. Das hier prangte mir auf der Konsole entgegen:

Code: (dl )
1
2
3
4
5
INSERT INTO ding (name) VALUES (?): 'etwas';

SELECT COUNT( * ) FROM map me WHERE ( id_groesse = ? AND id_ding = ? ): 'preis', '5'

INSERT INTO map (id_groesse, id_ding) VALUES (?, ?): 'preis', '58'

Was zur Hölle? Wieso werden da Spaltennamen als Werte verwendet?
renee
 2009-01-16 13:24
#118080 #118080
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Verwende am besten create_related:

Code (perl): (dl )
1
2
3
4
5
6
my $ding = $schema->resultset('ding')->create({
    name       => 'testding',
});
$ding->update();

$ding->create_related( 'groesse_has_ding', { idgroesse => 1, preis => 100 } );
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/
Cremator
 2009-01-16 13:56
#118085 #118085
User since
2003-11-26
97 Artikel
BenutzerIn
[default_avatar]
OK, habe den Fehler gefunden. Es lag nicht an DBIx::Class. Catalyst, bzw. eins seiner Plugins hat mir ein Bein gestellt. Ich benutze für die Formulare HTML::FormFu. FormFu war der Meinung die Felder wären nicht valide, hat sie entsorgt und für $form->param('id_groesse_1') und $form->param('preis_groesse_1') keinen Wert zurückgegeben - noch nicht mal undef. Damit war der Aufruf dann am Ende:

Code: (dl )
1
2
3
4
5
6
7
my $ding = $c->model('Db::Ding')->create({
name => $form->param('name'),
groesse => [
{ id_groesse => preis },
# etc für die weiteren größen
],
});

Was natürlich totaler Humbug ist.
<< >> 4 Einträge, 1 Seite



View all threads created 2009-01-16 11:07.