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