Maison > base de données > tutoriel mysql > Comment joindre efficacement des tables dans CakePHP en utilisant la méthode Find ?

Comment joindre efficacement des tables dans CakePHP en utilisant la méthode Find ?

Mary-Kate Olsen
Libérer: 2024-12-29 19:52:15
original
885 Les gens l'ont consulté

How to Efficiently Join Tables in CakePHP using the Find Method?

Joindre des tables avec la méthode Find de CakePHP

Pour récupérer des données de plusieurs tables avec la méthode de recherche CakePHP, envisagez les options suivantes :

Manière CakePHP standard

Établir des relations entre vos modèles en utilisant les propriétés actesAs et hasMany ou appartientTo. Par exemple :

class User extends AppModel {
    public $actsAs = ['Containable'];
    public $hasMany = ['Message'];
}

class Message extends AppModel {
    public $actsAs = ['Containable'];
    public $belongsTo = ['User'];
}
Copier après la connexion

Ensuite, utilisez le comportement conteneurable :

$this->Message->find('all', [
    'contain' => ['User'],
    'conditions' => ['Message.to' => 4],
    'order' => 'Message.datetime DESC'
]);
Copier après la connexion

Jointure personnalisée

Définissez une jointure personnalisée dans votre méthode de recherche :

$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'
]);
Copier après la connexion

Utiliser deux relations en même temps Modèle

Pour récupérer des données basées sur deux relations avec le même modèle, modifiez vos modèles et utilisez le comportement contenuable :

class User extends AppModel {
    public $actsAs = ['Containable'];
    public $hasMany = ['MessagesSent' => ['className' => 'Message', 'foreignKey' => 'from']];
    public $belongsTo = ['MessagesReceived' => ['className' => 'Message', 'foreignKey' => 'to']];
}

class Message extends AppModel {
    public $actsAs = ['Containable'];
    public $belongsTo = ['UserFrom' => ['className' => 'User', 'foreignKey' => 'from']];
    public $hasMany = ['UserTo' => ['className' => 'User', 'foreignKey' => 'to']];
}
Copier après la connexion

Trouver l'appel :

$this->Message->find('all', [
    'contain' => ['UserFrom'],
    'conditions' => ['Message.to' => 4],
    'order' => 'Message.datetime DESC'
]);
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal