2010-12-09 5 views
0

Ich habe die nächste Frage.Enthalten Verhalten, Bedingungen und leeren Array

Es Teil des Codes ist:

 $result = $this->find('all', array(
      'contain' => array(
       'User' => array(
        'fields' => 'id', 
        'conditions' => array(
         'id' => $user_id 
        ) 
       ) 
      ), 
      'fields' => 'url' 
     )); 

Dieser Fund() in der Methode der Projektmodellklasse genannt und ich möchte nur abgerufen werden Projekte, bei denen User.id einige Benutzer-ID an meine Methode übergeben gleich. Benutzer HABTM Projekt und Projekt HABTM Benutzer.

Aber ich habe die nach der Ausführung weiter:


app/views/projects/index.ctp (line 1) 

Array 
(
    [0] => Array 
     (
      [Project] => Array 
       (
        [url] => http://purpled.biz 
        [id] => 1 
       ) 

      [User] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [ProjectsUser] => Array 
           (
            [user_id] => 4 
            [project_id] => 1 
            [projects_users_role_id] => 0 
           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [Project] => Array 
       (
        [url] => http://google.com 
        [id] => 2 
       ) 

      [User] => Array 
       (
        [0] => Array 
         (
          [id] => 4 
          [ProjectsUser] => Array 
           (
            [user_id] => 4 
            [project_id] => 2 
            [projects_users_role_id] => 0 
           ) 

         ) 

       ) 

     ) 

    [2] => Array 
     (
      [Project] => Array 
       (
        [url] => http://test.com 
        [id] => 3 
       ) 

      [User] => Array 
       (
       ) 

     ) 

) 

Wie Sie dort sehen, das letzte Array mit leeren [Benutzer] Array ist, so wie kann ich diese leeres Array (ganz ausschließen [2] Array ich meine) ohne foreach/if-Blöcke zu verwenden? Ich weiß, dass die Verwendung von bindModel alles genauso gut machen wird, aber das ist nicht für meine Frage;) Also, wie?

Antwort

2

Wenn Sie Ihre Bedingungen in den Schlüssel 'contain' eingeben, werden die Ergebnisse in diesem bestimmten Modell gefiltert.

die richtigen Daten abrufen ich eine Frage vor sehr ähnlich wie diese here beantwortet haben. Sie müssten nur die dort genannten Modelle durch eigene Modelle ersetzen. Wenn Sie Probleme haben, die Antwort dort zu verstehen, lassen Sie es uns wissen.

Tipps für Ihre aktuelle Modellstruktur ich feststellen, dass Ihr ProjectsUser Modell ein zusätzliches Feld „projects_users_role_id“ hat. Wenn Ihr Join-Modell komplex ist (mehr als nur id, model1_id, model2_id), müssen Sie es durch ein Modell an sich darstellen. Es wird allgemein als hasMany Through Beziehung bezeichnet.

User hasMany ProjectsUser 
Project hasMany ProjectsUser 
ProjectsUserRole hasMany ProjectsUser 

ProjectsUser belongsTo User 
ProjectsUser belongsTo Project 
ProjectsUser belongsTo ProjectsUserRole 

Sie könnten "ProjectsUser" auch in etwas schöneres wie "ProjectMembership" umbenennen.

+0

Danke! Als Ergebnis habe ich unbindModel/bindModel verwendet, um Joins zu erstellen und für die Ergebnis-Array-Filterung zu halten. – purple