Recherche d'enregistrements avec JOIN dans CakePHP
Pour récupérer des données de plusieurs tables dans une seule requête à l'aide de la méthode de recherche de CakePHP, vous pouvez utiliser diverses techniques . Une approche consiste à utiliser les relations de données intégrées au framework et le comportement de confinement pour une récupération transparente des données.
La méthode CakePHP
Cette approche implique de définir des relations entre vos modèles et en tirant parti du comportement Contenable. En configurant des relations telles que :
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array('Message'); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array('User'); }
Vous pouvez ensuite récupérer les enregistrements associés à l'aide du paramètre contain dans la méthode de recherche :
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Jointures SQL personnalisées
Vous pouvez également définir des jointures SQL personnalisées pour spécifier les relations spécifiques entre les tables. Cela peut être utile dans des scénarios plus complexes. Voici un exemple :
$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' ));
Notez que cette méthode vous oblige à spécifier manuellement les champs que vous souhaitez récupérer des deux tables.
Utilisation de plusieurs relations avec le même modèle
Dans les cas où vous devez récupérer des données d'une même table via plusieurs relations, vous pouvez définir plusieurs relations avec différents alias. Voici un exemple :
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array( 'MessagesSent' => array( 'className' => 'Message', 'foreignKey' => 'from' ) ); public $belongsTo = array( 'MessagesReceived' => array( 'className' => 'Message', 'foreignKey' => 'to' ) ); }
Vous pouvez désormais utiliser le comportement de confinement pour récupérer les enregistrements liés à ces relations :
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
En utilisant ces techniques, vous pouvez récupérer efficacement les données de plusieurs tables dans vos applications CakePHP.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!