Empfehlungen: Erweiterte Suche

[solved] belongsTo, Formulare und Namenskoventionen

Datenbankobjekte strukturieren und validieren

[solved] belongsTo, Formulare und Namenskoventionen

Beitragvon boundaryfunctions » Mo 21. Nov 2011, 15:51

Hallo zusammen,

ich bin neu hier und auch noch CakePHP-Neuling.
Ich arbeite zur Zeit an einer kleinen Datenverwaltungsapp mit dem Framework (nutze die 2.0.3) und habe noch so meine Probleme mit den Namenskoventionen, bzw. wie man diese umgeht. Ich habe schon stundenlang gesucht, finde aber keine passende Lösung (auch wenn ich glaube, dass ich nicht so weit davon entfernt bin.

Also es geht um folgendes:
Ich habe in meiner Anwendung die Modelle User und Survey. Jede Survey hat drei belongsTo-Beziehungen zu User:
  • created_by
  • modified_by, und
  • manager.
In den Feldern steht jeweils die ID eines Users. Wie man schon sieht, kann ich mich hier nicht an die Namenskonventionen halten, weil es mehrere Beziehungen gibt. created_by und modified_by sollen später natürlich automatisch ausgefüllt werden, aber den "manager" soll man in der add- und edit-Action auswählen und verändern können.

Um das zu realisieren habe ich jetzt folgenden Code (ich beschränke mich mal auf die Add-Action, für Edit gilt das analog):
  • in der Modell-Klasse für Surveys (app/Model/Survey.php):
    Code: Alles auswählen

    public $belongsTo = array(
        'Manager' => array(
            'className' => 'User',
            'foreignKey' => 'manager',
        ),
    );
     
  • im Controller für die Surveys(app/Controller/SurveysController.php):
    Code: Alles auswählen

    public function add() {
        if ($this->request->is('post')) {
            $this->Survey->create();
            if ($this->Survey->save($this->request->data)) {
                $this->Session->setFlash(__('The survey has been saved'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The survey could not be saved. Please, try again.'));
            }
        }
        /* ...weiterer Code... */
        $managers = $this->Survey->Manager->find('list', array(
            'fields' => array('Manager.id', 'Manager.username'),
        ));
        $this->set(compact('audiometries', 'experimentees', 'users', 'managers'));
    }
     
  • in der Modell-Klasse für User(app/Model/User.php):
    Code: Alles auswählen

    public $hasMany = array(
        'Managing' => array(
            'className' => 'Survey',
            'foreignKey' => 'manager',
            'dependent' => false,
        ),
    );
     
  • in der View für das Add-Formular des Survey-Controllers(/app/View/Surveys/add.ctp):
    Code: Alles auswählen

    echo $this->Form->input('Manager');
     

So wird mein select-Element im Formular auch mit den entsprechenden User-Namen bevölkert, allerdings wird der ausgewählte Wert nicht korrekt abgespeichert, d.h. es wird dort gar nichts eingetragen.

Nachdem ich in der Doku gestöbert habe, habe ich für das Form-Element auch noch andere Varianten ausprobiert.
  • Code: Alles auswählen
    echo $this->Form->input('manager_id');

    Das Element wird nicht befüllt, aber ich kann trotzdem nichts speichern.
  • Code: Alles auswählen
    echo $this->Form->input('manager');

    Statt des Select bekomme ich ein Eingabefeld für eine Zahl, die wird dafür aber gespeichert.

Ich denke, das ganze hat irgendwas mit den nicht beachteten Namenskonventionen zu tun, aber ich komme nicht dahinter. Ich wäre sehr dankbar, wenn mir hier jemand auf die Sprünge helfen könnte.

Viele Grüße,
Marc
Zuletzt geändert von boundaryfunctions am Di 22. Nov 2011, 10:30, insgesamt 1-mal geändert.
Benutzeravatar
boundaryfunctions
 
Beiträge: 5
Registriert: Mo 21. Nov 2011, 15:26
CakePHP-Version: 2.0.x
OS: Debian/Ubuntu

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon euromark » Mo 21. Nov 2011, 17:09

hast du denn probiert, den code zu "backen"?
das wird dir nämlich alle konventionen etc automatisch vormachen - da lernt man gerade als neuling verdamt viel am anfang.
mein tipp!
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon boundaryfunctions » Mo 21. Nov 2011, 18:19

Hallo euromark,

vielen Dank für deine schnell Antwort!
Die Anwendung besteht aus deutlich mehr Controllern und Models und ich habe die Grundstruktur für alles gebacken, ist wirklich sehr lehrreich. Auch die Namenskonventionen sind mir ja grundsätzlich klar, aber ich kann in einer Tabelle ja schlecht drei mal "user_id" haben, weshalb ich nach einer Möglichkeit suche, die Funktionalität auch ohne die Konventionen herzustellen.
Nach allem, was ich gefunden habe, kann ich mit meiner Lösung von oben nicht ganz falsch liegen. Ich tippe ja gerade darauf, dass ich nur noch irgendetwas brauche, um die Formular-Eingabe für User wieder auf die ID herunterzubrechen, aber ich kriege es nicht hin.

Falls noch jemand anderes eine Idee hat, würde ich mich sehr freuen. Falls noch irgendetwas an Code fehlt, einfach Bescheid sagen, ich hoffe ich habe aber alle relevanten Stellen schon oben gepasted.

Viele Grüße,
Marc

edit:
Ok, das Problem ist gelöst, die Lösung findet sich hier: https://gist.github.com/1383338
Im Prinzip wäre es aber wohl besser, die Variable manager_id zu nennen, dann hätte ich das Problem nicht gehabt.
Benutzeravatar
boundaryfunctions
 
Beiträge: 5
Registriert: Mo 21. Nov 2011, 15:26
CakePHP-Version: 2.0.x
OS: Debian/Ubuntu

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon mbrod » Mo 21. Nov 2011, 22:51

Ich glaube, dass die prinzipielle Antwort auf das Problem unter http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#multiple-relations-to-the-same-model zu finden ist.
mbrod
 
Beiträge: 199
Registriert: Mi 20. Mai 2009, 18:09
Wohnort: Frankfurt am Main
CakePHP-Version: 1.3.8
OS: Mac OS X

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon Mathias » Mo 21. Nov 2011, 22:52

Auch auf der cakephp site wird das Szenario näher gebracht:
http://book.cakephp.org/2.0/en/models/a ... same-model

#edit: ;)
cheers
Benutzeravatar
Mathias
 
Beiträge: 225
Registriert: Mi 4. Jun 2008, 22:30
Wohnort: Berlin
CakePHP-Version: 1.3.x
OS: OS X 10.6.x

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon boundaryfunctions » Mo 21. Nov 2011, 23:18

Hallo und danke für eure Antworten!
Ich war auch hauptsächlich verwirrt, weil ich die entsprechenden Modelle und Controller gebacken habe, und da dann natürlich bei "manager_id" der Hinweis kam, dass es keinen Table "manager" gibt. Jetzt funktioniert es ja.
Benutzeravatar
boundaryfunctions
 
Beiträge: 5
Registriert: Mo 21. Nov 2011, 15:26
CakePHP-Version: 2.0.x
OS: Debian/Ubuntu

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon euromark » Mo 21. Nov 2011, 23:54

also
Code: Alles auswählen
echo $this->Form->input('manager_id');

sollte definitiv auch gehen, wenn du an den view
$managers
übergibst
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: belongsTo, Formulare und Namenskoventionen

Beitragvon boundaryfunctions » Di 22. Nov 2011, 10:29

Wie oben schon geschrieben funktioniert es definitiv, wenn man den Select im Formular so generieren lässt.
Code: Alles auswählen

echo $this->Form->input('manager', array('options' => $managers));
 


edit:
Ich habe mal ein [solved] vor den Titel gesetzt.
Benutzeravatar
boundaryfunctions
 
Beiträge: 5
Registriert: Mo 21. Nov 2011, 15:26
CakePHP-Version: 2.0.x
OS: Debian/Ubuntu

Re: [solved] belongsTo, Formulare und Namenskoventionen

Beitragvon euromark » Di 22. Nov 2011, 11:02

das hab ich schon gelesen.
mit options definition geht es immer immer.

aber solang sich 2.0 nich massiv geändert hat, sollte auch mein code schnipsel funktionieren :)

UPDATE: ich korrigiere mich: es MUSS funktionieren
habs eben grad selbst im aktuellen 2.0 head ausprobiert.
euromark
 
Beiträge: 643
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: [solved] belongsTo, Formulare und Namenskoventionen

Beitragvon boundaryfunctions » Di 22. Nov 2011, 11:05

Klar, der funktioniert auch (hatte ich ja auch ins gist reingeschrieben) und den nutze ich auch so. Dafür musste ich eben nur meine Datenbankspalte auch umbenennen, was kein Problem war, weil ich noch relativ am Anfang der Anwendung stehe. Falls aber mal jemand suchen und das hier finden sollte, der in seiner Anwendung schon weiter ist und keine Änderungen in der Datenbank mehr machen will, dann tut es auch die Variante mit Options.

Leute, vielen Dank für eure Hilfe, wirklich sehr gut ist das hier! :)
Benutzeravatar
boundaryfunctions
 
Beiträge: 5
Registriert: Mo 21. Nov 2011, 15:26
CakePHP-Version: 2.0.x
OS: Debian/Ubuntu


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron