"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como realizar uma consulta de junção com o método find do CakePHP?

Como realizar uma consulta de junção com o método find do CakePHP?

Publicado em 2024-11-02
Navegar:290

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

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:

  1. 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');
    }
  2. Renomeie a coluna messages.from para messages.user_id para facilitar a associação automática com base no relacionamento.
  3. 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'
));
Declaração de lançamento Este artigo foi reimpresso em: 1729175782 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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