Empfehlungen: Erweiterte Suche

Frage zu Model-Relation: hasOnehasMany?

Datenbankobjekte strukturieren und validieren

Frage zu Model-Relation: hasOnehasMany?

Beitragvon DerBjörn » Di 3. Aug 2010, 21:53

Hi,

ich habe gerade ein Problem eine gewisse Beziehung zwischen zwei Models herzustellen. Es handelt sich dabei um State und City.

Es ist so, dass jede Stadt einem Bundesstaat angehört (also Fremdschlüssel state_id in cities), aber gleichzeitig auch jeder Bundesstaat eine Hauptstadt haben kann (Fremdschlüssel city_id in states?).

Wie wird dieses realisiert? Bei der ersten Beziehung handelt es sich natürlich um eine hasMany:

Code: Alles auswählen
var $hasMany = array(
        'City' => array(
            'className' => 'City',
            'foreignKey' => 'state_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );


Bei der zweiten meiner Meinung nach um eine hasOne-Beziehung, also

Code: Alles auswählen
var $hasOne = array(
        'City' => array(
            'className' => 'City',
            'foreignKey' => 'id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

oder wie müsste das dann genau aussehen?

Das Problem ist, dass ich in meiner Übersicht nur die ID von City habe, aber eigentlich müsste da ja der Städtename erscheinen, genauso wie im Bearbeitsformular für einen Bundesstaat, aber auch dort ist die Städteliste leer. Es handelt sich um eine Standard-CRUD-Anwendung.

Vielen Dank im Voraus :)
DerBjörn
 
Beiträge: 9
Registriert: Di 3. Aug 2010, 21:03

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon Flo » Mi 4. Aug 2010, 07:30

Einfach den Alias der Verknüpfung ändern, dann ändert sich auch der Alias im Query.
Code: Alles auswählen

<?php
var $hasOne = array(
        'HomeCity' => array(
            'className' => 'City',
            'foreignKey' => 'homecity_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
?>
Flo
 
Beiträge: 85
Registriert: Mi 11. Jun 2008, 20:48
Wohnort: Bielefeld
CakePHP-Version: 1.3
OS: Mac OSX 10.6

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon DerBjörn » Mi 4. Aug 2010, 19:42

Hi,

danke erstmal für deine Antwort :)

Also... ich habe folgendes in der country.php:
Code: Alles auswählen

var $hasOne = array(
        'CapitalCity' => array(
            'className' => 'City',
            'foreignKey' => 'capitalcity_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
 


Ich bekomme folgende Fehlermeldung:
Warning (512): SQL Error: 1054: Unknown column 'CapitalCity.capitalcity_id' in 'on clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 681]


Wenn ich mir jetzt die Query angucke
Query: SELECT COUNT(*) AS `count` FROM `countries` AS `Country` LEFT JOIN `cities` AS `CapitalCity` ON (`CapitalCity`.`capitalcity_id` = `Country`.`id`) WHERE 1 = 1

dann müsste ich ja capitalcity_id nach id umbenennen, damit die Query "richtiger" wird, wobei die rechte Seite "= Country.id" ja auch nicht stimmt. Mhmm... bin verwirrt :mrgreen:
DerBjörn
 
Beiträge: 9
Registriert: Di 3. Aug 2010, 21:03

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon Flo » Mi 4. Aug 2010, 21:15

hm, gedankenfehler,

es müsste eine belongsTo verknüpfung sein, also muss in Country die CapitalCity gespeichert werden,
also quasi eine capitalcity_id
Flo
 
Beiträge: 85
Registriert: Mi 11. Jun 2008, 20:48
Wohnort: Bielefeld
CakePHP-Version: 1.3
OS: Mac OSX 10.6

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon DerBjörn » Mi 4. Aug 2010, 21:52

Hmm... ok... dann habe ich wohl die Beziehungen noch nicht verstanden ;)

Dachte, dass es sich um hasOne handeln würde, da ein Land nur eine Hauptstadt haben kann und kein anderes Land dieselbe, keine Stadt kann also die Hauptstadt von zwei Ländern sein. Bei belongsTo würde dieses aber doch gehen, oder stehe ich auf dem Schlauch?

Danke aber schon mal für dein Interesse :)
DerBjörn
 
Beiträge: 9
Registriert: Di 3. Aug 2010, 21:03

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon mbrod » Do 5. Aug 2010, 18:33

Erst einmal prinzipiell zu den Beziehungen:
Soweit ich CakePHP verstanden habe, bedeutet die Variable belongsTo, dass ich vom CityController auf das Model State zugreifen kann. Also z.B. so etwas wie $this->city->state->find
Oder umgekehrt, wenn ich in State hasMany definiert habe, kann ich im StateController mit $this->state->city->find auf das Model City zugreifen. Bzw. bestimmte Datenbankabfragen werden von CakePHP automatisch durchgefüht, die ihren Niederschlag in den Ergebnis-Arrays finden.

Konkret zur Hauptstadtfrage:
Hauptstadt ist eine Eigenschaft von City. Deshalb braucht es also ein Feld capital (boolean, tinyint(1)).
Mich hat das Beispiel nun auch interessiert und habe es mal mit allen Relations gebacken.
Geändert habe ich nur in state.php:
Code: Alles auswählen
    var $hasOne = array(
        'CapitalCity' => array(
            'className' => 'City',
            'foreignKey' => 'state_id',
            'conditions' => 'CapitalCity.capital=1',
            'fields' => '',
            'order' => ''
        )
    );
 


In der index.ctp von State kann man dann noch einfach eine Hauptstadt-Spalte einfügen.
Code: Alles auswählen
        <td><?php echo $state['CapitalCity']['name']; ?>&amp;nbsp;</td>
 


Es bleibt das Problem, dass man einem Bundesstaat mehrere Hauptstädte zuweisen kann. Dies ist vielleicht über die Validierung (isUnique?) möglich...
mbrod
 
Beiträge: 193
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon DerBjörn » Do 5. Aug 2010, 18:59

Auch dir danke ich für deine Antwort, ABER:

Hauptstadt ist eine Eigenschaft von City. Deshalb braucht es also ein Feld capital (boolean, tinyint(1)).


Diese Aussage weigere ich mich einfach mal zu akzeptieren ;) Der Stadt kann meiner Meinung nach ziemlich egal sein, ob sie jetzt Hauptstadt ist oder nicht...
Sowas sollte nach meiner Erfahrung nicht als Eigenschaft von City gelten. Bin aber gerne bereit, mich vom Gegenteil überzeugen zu lassen. Bisher bin ich es aber noch nicht.
DerBjörn
 
Beiträge: 9
Registriert: Di 3. Aug 2010, 21:03

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon euromark » Do 5. Aug 2010, 19:05

hauptstadt würde ich als attribut (tinyint 1) modelieren in "stadt"
und nicht als eigenes model...
euromark
 
Beiträge: 618
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.1
OS: Windows

Re: Frage zu Model-Relation: hasOnehasMany?

Beitragvon DerBjörn » Do 5. Aug 2010, 19:10

Das sagte ja "mbrod" schon. Will zwar hier nicht als Unbelehrbar gelten, aber gefallen tut mir diese Lösung nicht :)
Ich finde eigentlich die hasOne-Beziehung perfekt für meine Umsetzung. Datenbanktechnisch passt es ja schon so.

Ein weiteres Problem neben der "Es sind mehrere Hauptstädte für ein Land möglich" ist auch, dass ich bei der Änderung der Hauptstadt gleich mehrere Cities-Datensätze bearbeiten muss. 1x von true auf false und vice versa.
DerBjörn
 
Beiträge: 9
Registriert: Di 3. Aug 2010, 21:03


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast