Find Method com JOIN no CakePHP
Esta questão explora como realizar uma consulta que une duas tabelas, mensagens e usuários, usando o find do CakePHP método. Especificamente, precisamos recuperar informações de ambas as tabelas com base em uma condição em que o campo messages.from seja igual ao campo users.id e o campo messages.to seja igual a 4.
Existem dois campos primários. métodos para obter essa junção no CakePHP: o modo padrão do CakePHP e usando uma junção personalizada.
Modo CakePHP padrão
A abordagem recomendada é usar o método padrão do CakePHP, envolve a criação de relacionamentos entre os modelos e o uso do comportamento contido. Veja como:
Defina os relacionamentos em seus modelos de usuário e mensagem:
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array('Message'); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array('User'); }
Realize a seguinte consulta de localização:
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Junção personalizada
Como alternativa, você pode usar uma junção personalizada na consulta de localização:
$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' ));
Nesta junção personalizada, definimos explicitamente as condições de junção e selecionamos os campos a serem retornados.
Usando dois relacionamentos para o mesmo modelo
Se você deseja estabelecer dois relacionamentos com o mesmo modelo, você pode defini-los da seguinte forma:
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' ) ); }
Com esses relacionamentos definidos, você pode usar uma consulta de localização como esta:
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3