[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.당신이 할 수있는 두 가지 방법이 있습니다. 그 중 하나는 표준 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.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.
$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.
from https://stackoverflow.com/questions/5079908/cakephp-find-method-with-join by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 사용하여 대량 삽입 .NET (0) | 2020.04.06 |
---|---|
[SQL] 절 "과"MySQL을 포함하지 않음? (0) | 2020.04.06 |
[SQL] 어떻게 SQL Server에서 문자열의 각 단어의 첫 글자를 대문자로 할 수있는 가장 좋은 방법 (0) | 2020.04.06 |
[SQL] 어떻게 COUNT 집계에서 "제로"/ "0"을 포함하는? (0) | 2020.04.06 |
[SQL] 어떻게 인쇄 문을 사용하여 VARCHAR (MAX)를 인쇄하려면? (0) | 2020.04.06 |