복붙노트

[SQL] 가입과 방법을 찾을 수 CakePHP의

SQL

가입과 방법을 찾을 수 CakePHP의

안녕하세요,

나는이 CakePHP 찾기 방법을 사용하여 다음 쿼리를 수행해야합니다

SELECT *
FROM `messages`
INNER JOIN users ON messages.from = users.id
WHERE messages.to = 4
ORDER BY messages.datetime DESC

기본적으로 내가 가진 :

하나 개의 쿼리에서 두 테이블에서 정보를 검색 할 수 있습니다. users.id 필드는 가입 무엇의가에 그래서는 messages.from 필드와 동일합니다.

이 같은 될 필요가 그래서 난 내 MessagesController로하고 있습니다 :

$this->Message->find();

감사

해결법

  1. ==============================

    1.당신이 할 수있는 두 가지 방법이 있습니다. 그 중 하나는 표준 CakePHP의 방법이고, 다른 하나는 사용자 정의 조인을 사용하고 있습니다.

    당신이 할 수있는 두 가지 방법이 있습니다. 그 중 하나는 표준 CakePHP의 방법이고, 다른 하나는 사용자 정의 조인을 사용하고 있습니다.

    그것의 가치가이 충고는 CakePHP의 2.x를위한 것임을 지적하지 3.x를

    당신은 당신의 사용자 모델과 메시지 모델과의 관계를 만들고 함유 성 행동을 사용합니다 :

    class User extends AppModel {
        public $actsAs = array('Containable');
        public $hasMany = array('Message');
    }
    
    class Message extends AppModel {
        public $actsAs = array('Containable');
        public $belongsTo = array('User');
    }
    

    당신은 그 케이크는 자동적으로 당신을 위해 기록을 연결할 수 있도록 messages.user_id 할 messages.from 열을 변경해야합니다.

    그런 다음 메시지 컨트롤러에서이 작업을 수행 할 수 있습니다

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

    나는 그것이 시간과 작업을 많이 절약 할 수 있기 때문에, 첫 번째 방법을 사용하는 것이 좋습니다. 첫 번째 방법은 당신이 지금 필요로하는 일 외에 다른 찾기 통화 및 조건의 숫자에 사용할 수있는 관계를 설정하는 기초 작업을 수행합니다. 그러나, CakePHP는 자신의 조인을 정의하는 구문을 지원합니다. 그것은 MessagesController에서, 다음과 같이 할 것입니다 :

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

    참고,이 예에서는 현재 테이블과 같은 필드 이름 messages.from을 떠 났어요.

    여기에 같은 모델이 개 관계를 사용하여 첫 번째 예제를 할 수있는 방법입니다 :

    class User extends AppModel {
        public $actsAs = array('Containable');
        public $hasMany = array(
            'MessagesSent' => array(
                'className'  => 'Message',
                'foreignKey' => 'from'
             )
        );
        public $belongsTo = array(
            'MessagesReceived' => array(
                'className'  => 'Message',
                'foreignKey' => 'to'
             )
        );
    }
    
    class Message extends AppModel {
        public $actsAs = array('Containable');
        public $belongsTo = array(
            'UserFrom' => array(
                'className'  => 'User',
                'foreignKey' => 'from'
            )
        );
        public $hasMany = array(
            'UserTo' => array(
                'className'  => 'User',
                'foreignKey' => 'to'
            )
        );
    }
    

    지금 당신은이처럼 찾기 호출 할 수 있습니다 :

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

    2.Otro 예를 들어, 사용자 정의 데이터 매김을 위해 가입하세요

    Otro 예를 들어, 사용자 정의 데이터 매김을 위해 가입하세요

    컨트롤러 CakePHP는 2.6 CODE는 OK이다 :

    $this->SenasaPedidosFacturadosSds->recursive = -1;
        // Filtro
        $where = array(
            'joins' => array(
                array(
                    'table' => 'usuarios',
                    'alias' => 'Usuarios',
                    'type' => 'INNER',
                    'conditions' => array(
                        'Usuarios.usuario_id = SenasaPedidosFacturadosSds.usuarios_id'
                    )
                ),
                array(
                    'table' => 'senasa_pedidos',
                    'alias' => 'SenasaPedidos',
                    'type' => 'INNER',
                    'conditions' => array(
                        'SenasaPedidos.id = SenasaPedidosFacturadosSds.senasa_pedidos_id'
                    )
                ),
                array(
                    'table' => 'clientes',
                    'alias' => 'Clientes',
                    'type' => 'INNER',
                    'conditions' => array(
                        'Clientes.id_cliente = SenasaPedidos.clientes_id'
                    )
                ),
            ),
            'fields'=>array(
                'SenasaPedidosFacturadosSds.*',
                'Usuarios.usuario_id',
                'Usuarios.apellido_nombre',
                'Usuarios.senasa_establecimientos_id',
                'Clientes.id_cliente',
                'Clientes.consolida_doc_sanitaria',
                'Clientes.requiere_senasa',
                'Clientes.razon_social',
                'SenasaPedidos.id',
                'SenasaPedidos.domicilio_entrega',
                'SenasaPedidos.sds',
                'SenasaPedidos.pt_ptr'
            ),
            'conditions'=>array(
                'Clientes.requiere_senasa'=>1
            ),
            'order' => 'SenasaPedidosFacturadosSds.created DESC',
            'limit'=>100
        );
        $this->paginate = $where;
        // Get datos
        $data = $this->Paginator->paginate();
        exit(debug($data));
    

    또는 예 2, 활성 NOT 조건 :

    $this->SenasaPedidosFacturadosSds->recursive = -1;
        // Filtro
        $where = array(
            'joins' => array(
                array(
                    'table' => 'usuarios',
                    'alias' => 'Usuarios',
                    'type' => 'INNER',
                    'conditions' => array(
                        'Usuarios.usuario_id = SenasaPedidosFacturadosSds.usuarios_id'
                    )
                ),
                array(
                    'table' => 'senasa_pedidos',
                    'alias' => 'SenasaPedidos',
                    'type' => 'INNER',
                    'conditions' => array(
                        'SenasaPedidos.id = SenasaPedidosFacturadosSds.senasa_pedidos_id'
                    )
                ),
                array(
                    'table' => 'clientes',
                    'alias' => 'Clientes',
                    'type' => 'INNER',
                    'conditions' => array(
                        'Clientes.id_cliente = SenasaPedidos.clientes_id',
                        'Clientes.requiere_senasa = 1'
                    )
                ),
            ),
            'fields'=>array(
                'SenasaPedidosFacturadosSds.*',
                'Usuarios.usuario_id',
                'Usuarios.apellido_nombre',
                'Usuarios.senasa_establecimientos_id',
                'Clientes.id_cliente',
                'Clientes.consolida_doc_sanitaria',
                'Clientes.requiere_senasa',
                'Clientes.razon_social',
                'SenasaPedidos.id',
                'SenasaPedidos.domicilio_entrega',
                'SenasaPedidos.sds',
                'SenasaPedidos.pt_ptr'
            ),
            //'conditions'=>array(
            //    'Clientes.requiere_senasa'=>1
            //),
            'order' => 'SenasaPedidosFacturadosSds.created DESC',
            'limit'=>100
        );
        $this->paginate = $where;
        // Get datos
        $data = $this->Paginator->paginate();
        exit(debug($data));
    
  3. ==============================

    3.

            $services = $this->Service->find('all', array(
                'limit' =>4,
                'fields' => array('Service.*','ServiceImage.*'),
                'joins' => array(
                    array(
                            'table' => 'services_images',
                            'alias' => 'ServiceImage',
                            'type' => 'INNER',
                            'conditions' => array(
                            'ServiceImage.service_id' =>'Service.id'
                            )
                        ),
                    ),
                )
            );
    

    어레이가 null로는 goges.

  4. from https://stackoverflow.com/questions/5079908/cakephp-find-method-with-join by cc-by-sa and MIT license