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:
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'); }
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' ));
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