Empfehlungen: Erweiterte Suche

Rekursives Select

Datenbankobjekte strukturieren und validieren

Rekursives Select

Beitragvon Tobitobe » Do 8. Jan 2009, 11:30

Moin allerseits,

ich steh mal wieder etwas auf dem Schlauch.

Folgendes Problemchen:

Ich habe ein Model User, das eine hasOne-Verknüpfung zum Model Applicant hat.
Der Applicant hasMany Application (da man sich ja mehrfach bewerben kann).
Der User wiederum hat nochmals eine hasMany-Verknüpfung zur Application.
Grund: ein User _kann_ Applicant sein, muss er aber nicht. "Normale" User können nämlich verantwortlich für eine Application sein. Sprich, Bewerber und Sachbearbeiter werden in einer Tabelle gehalten, allerdings durch ACL's und das Applicant-Objekt differenziert.

Nun versuche ich mich gerade an einer Abfrage, die es mir erlaubt, für den angemeldeten User alle Bewerbungen zu finden, die ihm zugeordnet sind (Application.user_id). Kein Problem. Dazu möchte ich nun folgende Daten anzeigen:
- Name des Bewerbers (sollte User.firstname / User.lastname sein...)
- Stellentitel (funktioniert via Objekt Vacancy)
- Eingangsdatum (Application.created)
- Status (Application.status_id)

Das Problem ist nun der Name des Bewerbers, da er ebenfalls aus dem User-Model gelesen werden muss, neben den Userdaten des angemeldeten Users. Bislang mache ich zwei Abfragen, um den Namen des Bewerbers nachzulesen, hätte aber gerne alle in einem find('all') abgedeckt.

Hier mal mein Coding:
Code: Alles auswählen

...
$applicationParams = array (
                'conditions' => array (                
                    'Application.user_id' => $user['User']['id'],
                    'Status.context' => 'Application'
                ),     
                'fields' => array (
                    'Applicant.id',
                    'Applicant.user_id',                   
                    'Status.id',
                    'Status.statusvalue',
                    'Application.created',
                    'Vacancy.title',
                    'Applicant.user_id',
                    'User.firstname',
                    'User.lastname'
                ), 
                'order' => 'Application.created'
            );
            $applications = $this->Applicant->Application->find('all', $applicationParams);
           
            foreach($applications as $application) {
                $applicantParams = array(
                    'conditions' => array (                
                        'User.id' => $application['Applicant']['user_id']
                    ),             
                    'fields' => array (
                        'Applicant.id',                    
                        'User.firstname',
                        'User.lastname'
                    )
                );         
                $applicants = $this->find('all', $applicantParams);
                      }
...
 


Jemand ne Idee, wie ich das zusammenfassen könnte?

Thx für Eure Hilfe,
Tobi
Tobitobe
 
Beiträge: 45
Registriert: Mi 11. Jun 2008, 08:41
Wohnort: Neuss
CakePHP-Version: 1.2.0.7962 Final
OS: Mac OS X

Re: Rekursives Select

Beitragvon euromark » Do 8. Jan 2009, 18:08

das sollten doch 2 versch. array bäume sein, weil du einmal

Application und einmal User hast

spricht $this->data['Application']['user_id'] und
einmal $this->data['User']['user_id']

die kommen sich dann eigntlich nich ins gehege^^ oder hab ich da was beim durchlesen missverstanden?

aufsetzten kann man das ja dann im model application
und nur als foreign key dann die user_id bzw als Model User eintragen
dadurch ist die logische trennung zum eigentlichen "user" vollzogen
gruß mark
euromark
 
Beiträge: 644
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows

Re: Rekursives Select

Beitragvon Tobitobe » Do 8. Jan 2009, 18:21

Das sind zwei Array-Bäume, das ist schon richtig.
Ich aber weiß nicht, ob das wirklich so funktioniert, weil ich ja einmal User-Daten des aktuellen und einmal User-Daten den Bewerbers in einem find() laden möchte.

Ich hab's zwar mit leichten Modifikationen am obigen Code hin bekommen, aber ich würde gerne die Schleife um die Applications sparen. Ich hatte es schon mit der Option recursive probiert, in der Hoffnung, Cake wäre so schlau und würde mir die Applicant.user_id automatisch noch weiter aufdröseln und mir den Namen des Users dazu liefern, was aber leider nicht geklappt hat. Das wäre dann die Lösung gewesen. :-)
Tobitobe
 
Beiträge: 45
Registriert: Mi 11. Jun 2008, 08:41
Wohnort: Neuss
CakePHP-Version: 1.2.0.7962 Final
OS: Mac OS X

Re: Rekursives Select

Beitragvon Tobitobe » Do 8. Jan 2009, 20:06

Okay, ich stand irgendwie auf dem Schlauch. :roll: Es ging nämlich viel einfacher...

Code: Alles auswählen

    function getAssignedApplications($user = array ()) {
        if (!empty ($user)) {          
            $applicationParams = array (
                'conditions' => array (                
                    'Application.user_id' => $user['User']['id'],
                    'Status.context' => 'Application'
                ), 
                'order' => 'Application.created',
                'recursive' => 2
            );
            return $this->Applicant->Application->find('all', $applicationParams);
        } else {
            return false;
        }
    }
 


Danke Dir nochmal!
Tobitobe
 
Beiträge: 45
Registriert: Mi 11. Jun 2008, 08:41
Wohnort: Neuss
CakePHP-Version: 1.2.0.7962 Final
OS: Mac OS X

Re: Rekursives Select

Beitragvon euromark » Do 8. Jan 2009, 21:01

hmm, interessant
spätestens mit recursive 2 sollte er das dann tun

ansonsten mit der "contain" beh. probieren
auch da sollte es dann klappen (und vor allem dann NUR in die eine richtung Applicant -> User, und nicht
noch alle anderen recursive 2 connections^^)
euromark
 
Beiträge: 644
Registriert: Fr 27. Jun 2008, 22:17
Wohnort: München
CakePHP-Version: 2.x
OS: Windows


Zurück zu Models

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron