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
Mary-Kate Olsenoriginal
2024-12-29 19:52:15886parcourir

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'];
}

Ensuite, utilisez le comportement conteneurable :

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

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'
]);

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']];
}

Trouver l'appel :

$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!

Déclaration:
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