Empfehlungen: Erweiterte Suche

Probleme mit 1:1 (hasOne) Beziehung

Datenbankobjekte strukturieren und validieren

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon havanna » Di 24. Feb 2009, 22:42

Hallo,
ich kann mir gut vorstellen, dass das Cake nicht "gebacken" bekommt, weil es (auf den ersten Blick) nicht unbedingt logisch erscheint.

Ich meine damit: wenn ich eine 1:1 Beziehung habe, verstosse ich eigentlich gegen die Regeln der Datenbank Normalisierung.

Trotzdem: Hast du es einmal so versucht:
class Client extends AppModel {
var $name = "Client";
var $hasOne = array('progress'=>
array( 'className' => 'progresses',
'dependent'=>'false' ,
'foreignKey' => false,
'conditions' => array('progresses.id = clients.id'))

Und das gleiche dann im Progress-Model - nur umgekehrt.

Ciao Thomas
Benutzeravatar
havanna
 
Beiträge: 191
Registriert: Mi 15. Okt 2008, 23:12
Wohnort: Bodman-Ludwigshafen
CakePHP-Version: 1.2.x
OS: WIN

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon euromark » Di 24. Feb 2009, 23:54

naja, halte ich für nich so sinnvoll.
abgesehen davon, dass es nich
'className' => 'progresses',
sondern
'className' => 'Progress', (man beachte Singular und erster Buchstabe Groß)
heißen müsste (analog der erste Klassenname)

Cake kriegt es ohne weiteres gebacken, ohne auch nur irgendwas zusätzlich zu definieren
und in dem vorliegenden Fall tut es das ja auch.
Es läuft genau so wie zu erwarten ist (1x oder 0x progresses pro clients) - nur dass unser Poster irgendwas anderes möchte, wie die
Relation 1:1 hergibt (bzw wozu sie eigentich gedacht ist..)
euromark
 
Beiträge: 618
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.1
OS: Windows

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon getit » Mi 25. Feb 2009, 10:29

@havanna
Ja hab ich auch probiert.

Nochmal zur Erklärung:
Ein Client (Patient, ...) ruft an.
Im oberen linken div werden seine Daten notiert.
Im oberen rechten div werden seine Gruppenzugehörigkeiten erfasst.
Im unteren div soll zu jedem Clienten ein Verlauf angezeigt werden. Hier wird erfasst welcher MA sich gekümmert hat, wie lange,... .

Also:
Zu den Gruppen: Ein Client kann mehreren Gruppen angehören. Eine Gruppe kann mehrere Clienten umfassen. m:n
Zu dem Verlauf: Ein Client hat einen Verlauf. Ein Verlauf gehört zu einem Clienten. 1:1
getit
 
Beiträge: 105
Registriert: Mo 22. Dez 2008, 13:06
CakePHP-Version: 1.2.1.8004
OS: Vista

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon Kratos » Mi 25. Feb 2009, 13:56

Hallo getit,

weiss nicht ob du es schon hinbekommen hast. Hab mir das Alles auch nicht so durch gelesen.
Hier mal mein Vorschlag.

Im Progress-Model:
Code: Alles auswählen
var $belongsTo = array('Client');


Im Client-Model:
Code: Alles auswählen
var $hasOne = array('Progress');


Im Client-Controller:
Code: Alles auswählen
$this->set('Progresses', $this->Client->Progress->find('list'));

Dies liefert ein Key-Value-Array zurück.

Im add()-View des Client-Controllers:
Code: Alles auswählen
echo $form->input('progress_id');
Kratos
 
Beiträge: 14
Registriert: So 18. Jan 2009, 01:56

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon getit » Mi 25. Feb 2009, 18:17

@Kratos

Vielen Dank für Deinen Hilfeversuch.

Hat aber leider auch nix geholfen.

Im Progress-Model:
var $belongsTo = array('Client');

D.h. Fremdschlüssel 'client_id' in Progress
Wieso dann:
echo $form->input('progress_id');

Wo soll der Fremdschlüssel 'progress_id' herkommen.
1:1 Beziehung hat doch bloß einen Fremdschlüssel (das ist: client_id).

Ich habe Deine Vorschlag gerade trotzdem mal getestet:
Hier nochmal genau was ich gemacht hab:
Tabelle 'progresses': Foreign key 'client_id'
Tabelle 'clients': Foreign key 'progress_id'

Im Model:
Progress: var $belongsTo = array('Client');
Client: var $hasOne = array('Progress');

Im Controller (ClientsController/add):
$this->set('progresses', $this->Client->Progress->find('list'));

Im add.ctp:
echo $form->input('progress_id');

Leider erhalte ich als Ausgabe nur nen leeres Dropdown-Feld mit Label 'Progress'
Habe mir auch mal mit:
Code: Alles auswählen

pr($progresses);
 

Mal das Array zurückgeben lassen. Das ist leer.

Wäre nett wenn Du Deinen Vorschlag nochmal genau (Wie sehen Deine Tabellen aus?) beschreiben würdest. Trotzdem Danke für den Versuch.
getit
 
Beiträge: 105
Registriert: Mo 22. Dez 2008, 13:06
CakePHP-Version: 1.2.1.8004
OS: Vista

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon Kratos » Do 26. Feb 2009, 00:09

Hi getit,

mal eine Verständnis-Frage: Du verwendest doch 'date' in der Datenbanktabelle 'Progress'. Das heisst doch das ein Datum (z.B.: 2009-02-25) mehrere Clients haben kann. Oder kann dieses Datum nur einmal vergeben werden? Wenn nicht müsste es aber eine 1:n Relation sein.

Ansonsten heisst es: 'Progress hasOne Client' and 'Client belongsTo Progress'. In der Datenbanktabelle 'Clients' ein Feld namens 'progress_id' anlegen. Im Controller 'Clients' dann:
Code: Alles auswählen
$this->set('progresses', $this->Client->Progress->find('list'));

Um einen bestimmten Wert zu bekommen musst du $displayField verwenden.
Hast du dann das aussagekräftigste Feld des Models bestimmt, wird das Select-Feld im Add()-View damit gefüllt.
Code: Alles auswählen
echo $form->input('progress_id');


Und achte auf die korrekte Bezeichnung der Datenbanktabelle im Model/Controller/View. Du hast nähmlich in deinen hier geschriebenen Texten 'process' und dann mal wieder 'progress' verwendet.
Kratos
 
Beiträge: 14
Registriert: So 18. Jan 2009, 01:56

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon getit » Do 26. Feb 2009, 09:17

@Kratos
Danke für Deine Hilfe.
Aber jetzt hab ich ein Verständnisproblem.
Du verwendest doch 'date' in der Datenbanktabelle 'Progress'. Das heisst doch das ein Datum (z.B.: 2009-02-25) mehrere Clients haben kann. Oder kann dieses Datum nur einmal vergeben werden?

Das Datum kann schon mehrmals verwendet werden. Eben für jeden Client, der an diesem Tag beraten wird.

Nochmal wie ich mir das vorstelle:
Also ein Klient ruft an.
Zu dem Klient wird neben den Benutzerdaten ein Verlauf geführt (der Inhalt der Tabelle Progresses).
Einen Verlauf gibt es schon öfters - eben sooft wie ein Klient anruft. Aber ein Verlauf ist immer eindeutig. D.h. es wird nicht ein Verlauf für alle Klienten geführt, sondern jeder Klienten hat seinen eigenen Verlauf.
Deshalb dachte ich das ist eine 1:1 Beziehung.
getit
 
Beiträge: 105
Registriert: Mo 22. Dez 2008, 13:06
CakePHP-Version: 1.2.1.8004
OS: Vista

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon Kratos » Do 26. Feb 2009, 14:39

Also, jetzt aber. Wenn ein Verlauf nur einen Client besitzt und für den nächsten Client ein komplett neuer Verlauf angelegt wird ist es natürlich 'hasOne'. Hatte durch das 'date' etwas missverstanden. :oops:
Kratos
 
Beiträge: 14
Registriert: So 18. Jan 2009, 01:56

Re: Probleme mit 1:1 (hasOne) Beziehung

Beitragvon getit » Fr 27. Feb 2009, 20:32

:D Gelöst :D

Mit der Hilfe von euromark (Danke!!!) konnte ich das Problem endlich lösen.

Hier nen Tutorial: tutorials-und-snippets/1-1-beziehung-speichern-t181.html
getit
 
Beiträge: 105
Registriert: Mo 22. Dez 2008, 13:06
CakePHP-Version: 1.2.1.8004
OS: Vista

Vorherige

Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast