„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie führe ich eine Join-Abfrage mit der find-Methode von CakePHP durch?

Wie führe ich eine Join-Abfrage mit der find-Methode von CakePHP durch?

Veröffentlicht am 02.11.2024
Durchsuche:396

How to Perform a Join Query with CakePHP\'s find Method?

Suchmethode mit JOIN in CakePHP

Diese Frage untersucht, wie eine Abfrage durchgeführt wird, die zwei Tabellen, Nachrichten und Benutzer mit der Suche von CakePHP verbindet Verfahren. Konkret müssen wir Informationen aus beiden Tabellen abrufen, basierend auf einer Bedingung, bei der das Feld „messages.from“ gleich dem Feld „users.id“ und das Feld „messages.to“ gleich 4 ist.

Es gibt zwei primäre Methoden zum Erreichen dieses Joins in CakePHP: der Standard-CakePHP-Weg und die Verwendung eines benutzerdefinierten Joins.

Standard-CakePHP-Weg

Der empfohlene Ansatz ist die Verwendung der CakePHP-Standardmethode, die beinhaltet das Erstellen von Beziehungen zwischen den Modellen und die Verwendung des eindämmbaren Verhaltens. So geht's:

  1. Definieren Sie die Beziehungen in Ihren Benutzer- und Nachrichtenmodellen:

    class User extends AppModel {
     public $actsAs = array('Containable');
     public $hasMany = array('Message');
    }
    
    class Message extends AppModel {
     public $actsAs = array('Containable');
     public $belongsTo = array('User');
    }
  2. Benennen Sie die Spalte „messages.from“ in „messages.user_id“ um, um die automatische Zuordnung basierend auf der Beziehung zu ermöglichen.
  3. Führen Sie die folgende Suchabfrage aus:

    $this->Message->find('all', array(
     'contain' => array('User'),
     'conditions' => array(
         'Message.to' => 4
     ),
     'order' => 'Message.datetime DESC'
    ));

Benutzerdefinierter Join

Alternativ können Sie einen benutzerdefinierten Join innerhalb der Suchabfrage verwenden:

$this->Message->find('all', array(
    'joins' => array(
        array(
            'table' => 'users',
            'alias' => 'UserJoin',
            'type' => 'INNER',
            'conditions' => array(
                'UserJoin.id = Message.from'
            )
        )
    ),
    'conditions' => array(
        'Message.to' => 4
    ),
    'fields' => array('UserJoin.*', 'Message.*'),
    'order' => 'Message.datetime DESC'
));

In diesem benutzerdefinierten Join definieren wir explizit die Join-Bedingungen und wählen die zurückzugebenden Felder aus.

Verwenden von zwei Beziehungen zum selben Modell

Wenn Sie zwei Beziehungen zum selben Modell herstellen möchten, können Sie diese wie folgt definieren:

class User extends AppModel {
    public $actsAs = array('Containable');
    public $hasMany = array(
        'MessagesSent' => array(
            'className'  => 'Message',
            'foreignKey' => 'from'
         ),
        'MessagesReceived' => array(
            'className'  => 'Message',
            'foreignKey' => 'to'
         )
    );
}

class Message extends AppModel {
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'UserFrom' => array(
            'className'  => 'User',
            'foreignKey' => 'from'
        ),
        'UserTo' => array(
            'className'  => 'User',
            'foreignKey' => 'to'
        )
    );
}

Wenn diese Beziehungen definiert sind, können Sie eine Suchabfrage wie diese verwenden:

$this->Message->find('all', array(
    'contain' => array('UserFrom'),
    'conditions' => array(
        'Message.to' => 4
    ),
    'order' => 'Message.datetime DESC'
));
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729175782 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3