Empfehlungen: Erweiterte Suche

Tabelle mit mehreren Fremdschlüsseln

Datenbankobjekte strukturieren und validieren

Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Di 22. Sep 2009, 12:10

Gegeben seien zwei Tabellen. Die eine Tabelle (statuslogs) enthält folgende Felder:
id
angebot_id
user_id
status_vorher
status_nachher
Das zugehörige Model:
Code: Alles auswählen
var $belongsTo = array(
            'Angebot' => array('className' => 'Angebot',
                                'foreignKey' => 'angebot_id',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            ),         
                       'User' => array('className' => 'User',
                                'foreignKey' => 'user_id',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )
    );

(User kommt auch aus einer anderen Tabelle, wird aber korrekt aufgelöst.)

Die zweite Tabelle (angebot_status) enthält die Bezeichnungen für den Status (vorher/nachher):
id
name

Nun sollen in der Tabelle statuslogs, wenn sie im View angezeigt wird, die Felder status_vorher und status_nachher entsprechend aufgelöst werden, so dass im View nicht mehr die ID des Status steht, sondern dessen ausgeschriebene Bezeichnung aus dem Feld name.

Ich denke, das muss ich irgendwie im Model angeben, nur wie? Umbenennen der Felder und anhängen der Postfix _id ist leider so gut wie nicht mehr möglich.

Wenn ich das im [i]statuslog[i] Model anhänge:
Code: Alles auswählen
            'Statuslog' => array('className' => 'Statuslog',
                                'foreignKey' => 'status_vorher',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )

Sieht der Query ja schon mal gar nicht so schlecht aus:
Code: Alles auswählen
LEFT JOIN `statuslogs` AS `Statuslog` ON (`Statuslog`.`status_vorher` = `Statuslog`.`id`) WHERE 1 = 1 LIMIT 10

Allerdings bekomme ich die Fehlermeldung:
Not unique table/alias: 'Statuslog'

Was bedeutet das jetzt? Was ist da nicht eindeutig?
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Mi 23. Sep 2009, 10:47

Ich glaube, ich bin einen Schritt weiter. Im Model für Statuslog muss es wohl heißen:
Code: Alles auswählen
'Status' => array('className' => 'Status',
                                'foreignKey' => 'status_vorher',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )

Dann kommt auch ein LEFT JOIN raus, der Sinn ergibt:
Code: Alles auswählen
LEFT JOIN `status` AS `Status` ON (`Statuslog`.`status_vorher` = `Status`.`id`)

Allerdings werden im View Statuslog immer noch nur die IDs angezeigt und nicht die zugehörige Name aus der Tabelle Status. Fehlt da irgendwo noch was?
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Mo 28. Sep 2009, 10:32

Hat keine reine Idee? In der Literatur finde ich immer nur die Aussage, dass es auch geht, wenn man sich nicht an die Namenskonventionen hält, aber wie es dann geht, darüber wird sich immer ausgeschwiegen. Aber es muss doch irgendwie möglich sein. :|
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Mo 28. Sep 2009, 14:10

Wenn ich den Code:
Code: Alles auswählen
'Status' => array('className' => 'Status',
                                'foreignKey' => 'status_vorher',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )

in der Datei app/vendors/shells/tasks/model.php an der entsprechenden Stelle ergänze und dann alles (Model, View, Controller) neu backe, werden die Fremdschlüssel korrekt, wie gewünscht aufgelöst.

Bleibt noch ein Problem. Es gibt auch einen Status status_nacher aus der gleichen Tabelle. Wenn ich jetzt mache:
Code: Alles auswählen
'Status' => array('className' => 'Status',
                                'foreignKey' => 'status_vorher',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )
            ,
            'Status' => array('className' => 'Status',
                                'foreignKey' => 'status_nacher',
                                'conditions' => '',
                                'fields' => '',
                                'order' => ''
            )

Dann wird nur status_nacher aufgelöst. Für status_vorher habe ich wieder nur die IDs da stehen. Wie bekomme ich jetzt beide aufgelöst?
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Di 29. Sep 2009, 09:42

Ein Schritt weiter?
Mit Google habe ich jetzt folgende Lösung gefunden:
Code: Alles auswählen
var $belongsTo = array (
    'Publisher1' => array('className'=>'Publisher',
                    'foreignKey'=>'publisher_id'),
    'Publisher2' => array('className'=>'Publisher',
                    'foreignKey'=>'co_publisher_id').......

Bei dem Code wollte er den Wert des Fremdschlüssel aus einer Tabelle holen, die es gar nicht gibt, nämlich aus einer Tabelle mit dem Namen des Arrays (hier Publisher2).

Dann bin ich auf 'Conditions' gestoßen, also dass es damit funktionieren soll:
Code: Alles auswählen
'Status' => array('className' => 'Status',
                                'foreignKey' => 'status_vorher',
                                'conditions' => 'Statuslog.status_nacher',
                                'fields' => '',
                                'order' => ''
            )

Das gibt schon mal einen recht viel versprechenden Query:
Code: Alles auswählen
LEFT JOIN `hpx_status` AS `Status` ON (`Statuslog`.`status_nacher` AND `Statuslog`.`status_vorher` = `Status`.`id`)

Leider wird beim Backen nur wieder der Fremdschlüssel im View aufgelöst. Also auch noch nicht ganz das, was ich will.
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP

Re: Tabelle mit mehreren Fremdschlüsseln

Beitragvon Luckie » Di 29. Sep 2009, 10:19

Code: Alles auswählen
var $belongsTo = array (
    'Publisher1' => array('className'=>'Publisher',
                    'foreignKey'=>'publisher_id'),
    'Publisher2' => array('className'=>'Publisher',
                    'foreignKey'=>'co_publisher_id').......

Das geht auf einmal doch. Habe jetzt also, was ich will. ;)
Luckie
 
Beiträge: 115
Registriert: Fr 22. Mai 2009, 12:16
OS: Windows XP


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast