Méthode Find avec JOIN dans CakePHP
Cette question explore comment effectuer une requête qui joint deux tables, messages et utilisateurs, à l'aide de la recherche de CakePHP méthode. Plus précisément, nous devons récupérer les informations des deux tables en fonction d'une condition dans laquelle le champ messages.from est égal au champ users.id et le champ messages.to est égal à 4.
Il existe deux principaux méthodes pour réaliser cette jointure dans CakePHP : la méthode CakePHP standard et l'utilisation d'une jointure personnalisée.
Manière CakePHP standard
L'approche recommandée consiste à utiliser la méthode standard de CakePHP, qui implique de créer des relations entre les modèles et d'utiliser le comportement contenuable. Voici comment :
Définissez les relations dans vos modèles d'utilisateur et de message :
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array('Message'); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array('User'); }
Effectuez la requête de recherche suivante :
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Jointure personnalisée
Vous pouvez également utiliser une jointure personnalisée dans la requête de recherche :
$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' ));
Dans cette jointure personnalisée, nous définissons explicitement les conditions de jointure et sélectionnons les champs à renvoyer.
Utilisation de deux relations avec le même modèle
Si vous souhaitez établir deux relations avec le même modèle, vous pouvez les définir comme suit :
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' ) ); }
Une fois ces relations définies, vous pouvez utiliser une requête de recherche comme celle-ci :
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3