"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo realizar una consulta de unión con el método de búsqueda de CakePHP?

¿Cómo realizar una consulta de unión con el método de búsqueda de CakePHP?

Publicado el 2024-11-02
Navegar:529

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

Método de búsqueda con JOIN en CakePHP

Esta pregunta explora cómo realizar una consulta que una dos tablas, mensajes y usuarios, utilizando la búsqueda de CakePHP método. Específicamente, necesitamos recuperar información de ambas tablas en función de una condición en la que el campo mensajes.de es igual al campo usuarios.id y el campo mensajes.a es igual a 4.

Hay dos principales métodos para lograr esta unión en CakePHP: la forma estándar de CakePHP y usando una unión personalizada.

Método estándar de CakePHP

El enfoque recomendado es utilizar el método estándar de CakePHP, que Implica crear relaciones entre los modelos y utilizar el comportamiento contenible. Así es como:

  1. Defina las relaciones en sus modelos de Usuario y Mensaje:

    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. Cambie el nombre de la columna mensajes.de a mensajes.user_id para facilitar la asociación automática basada en la relación.
  3. Realice la siguiente consulta de búsqueda:

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

Unión personalizada

Como alternativa, puede utilizar una unión personalizada dentro de la consulta de búsqueda:

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

En esta unión personalizada, definimos explícitamente las condiciones de unión y seleccionamos los campos que se devolverán.

Usar dos relaciones con el mismo modelo

Si desea establecer dos relaciones con el mismo modelo, puede definirlas de la siguiente manera:

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

Con estas relaciones definidas, puede utilizar una consulta de búsqueda como esta:

$this->Message->find('all', array(
    'contain' => array('UserFrom'),
    'conditions' => array(
        'Message.to' => 4
    ),
    'order' => 'Message.datetime DESC'
));
Declaración de liberación Este artículo se reimprime en: 1729175782 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3