Dans CakePHP, la méthode find permet d'effectuer des requêtes de base de données puissantes. Pour effectuer une requête JOIN, vous pouvez soit utiliser la fonctionnalité de confinement intégrée, soit définir des jointures personnalisées.
Confinement (recommandé)
Pour utiliser le confinement, vous devez définir relations entre vos modèles. Par exemple, si vous avez un modèle Message et un modèle Utilisateur, vous déclarerez les associations dans vos modèles :
class User extends AppModel { public $hasMany = ['Message']; } class Message extends AppModel { public $belongsTo = ['User']; }
Une fois ces relations configurées, vous pouvez effectuer une requête JOIN en incluant contain dans votre recherche appel de méthode :
$messages = $this->Message->find('all', [ 'contain' => ['User'], 'conditions' => ['Message.to' => 4], 'order' => 'Message.datetime DESC' ]);
Jointures personnalisées
Si vous préférez définir des jointures personnalisées, vous pouvez utiliser les jointures dans votre appel de méthode find :
$messages = $this->Message->find('all', [ 'joins' => [ [ 'table' => 'users', 'alias' => 'UserJoin', 'type' => 'INNER', 'conditions' => ['UserJoin.id = Message.from'] ] ], 'conditions' => ['Message.to' => 4], 'fields' => ['UserJoin.*', 'Message.*'], 'order' => 'Message.datetime DESC' ]);
Notez que vous devrez spécifier explicitement l'option de champs lors de l'utilisation de jointures personnalisées pour vous assurer que les champs corrects sont renvoyés.
Utilisation Relations multiples avec le même modèle
Une autre approche consiste à créer plusieurs relations avec le même modèle pour différentes associations. Par exemple, dans le cas de messages, vous pourriez avoir une relation MessageSent pour les messages sortants et une relation MessageReceived pour les messages entrants :
class User extends AppModel { public $hasMany = [ 'MessagesSent' => ['className' => 'Message', 'foreignKey' => 'from'], 'MessagesReceived' => ['className' => 'Message', 'foreignKey' => 'to'] ]; } class Message extends AppModel { public $belongsTo = [ 'UserFrom' => ['className' => 'User', 'foreignKey' => 'from'], 'UserTo' => ['className' => 'User', 'foreignKey' => 'to'] ]; }
Avec ces relations, vous pouvez effectuer une requête JOIN comme suit :
$messages = $this->Message->find('all', [ 'contain' => ['UserFrom'], 'conditions' => ['Message.to' => 4], 'order' => 'Message.datetime DESC' ]);
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!