"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment effectuer une requête de jointure avec la méthode find de CakePHP ?

Comment effectuer une requête de jointure avec la méthode find de CakePHP ?

Publié le 2024-11-02
Parcourir:191

How to Perform a Join Query with CakePHP\'s find Method?

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 :

  1. 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');
    }
  2. Renommez la colonne messages.from en messages.user_id pour faciliter l'association automatique en fonction de la relation.
  3. 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'
));
Déclaration de sortie Cet article est réimprimé à l'adresse : 1729175782. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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