나는 행동하려고하고있다. 그래서, 대신에 다음과 같은 SQL 구문을 사용하는 :CakePHP와 조인을 중첩하는 방법은 무엇입니까?
select *
from tableA INNER JOIN
tableB on tableA.id = tableB.tableA_id LEFT OUTER JOIN
(tableC INNER JOIN tableD on tableC.tableD_id = tableD.id)
on tableC.tableA_id = tableA.id
내가 CakePHP의 model->find()
를 사용하고 싶습니다. 이것은 Paginator
을 사용하게 할 것입니다, 왜냐하면 그것은 제가 이해할 수있는 한 커스텀 SQL 쿼리와 함께 작동하지 않을 것이기 때문입니다. (당신이 하나의 페이지 매김 쿼리를 하드 코딩하지 않는 한 다소 유연하지 않은 것 같습니다).
지금까지 시도했습니다 무엇 :
(가) 구조로 결합 중첩이다/* inside tableA_controller.php, inside an action, e.g. "view" */
$this->paginate['recursive'] = -1; # suppress model associations for now
$this->paginate['joins'] = array(
array(
'table' => 'tableB',
'alias' => 'TableB',
'type' => 'inner',
'conditions' => 'TableB.tableA_id = TableA.id',
),
array(
'table' => 'tableC',
'alias' => 'TableC',
'type' => 'left',
'conditions' => 'TableC.tableA_id = TableA.id',
'joins' = array(# this would be the obvious way to do it, but doesn't work
array(
'table' => 'tableD',
'alias' => 'TableD',
'type' => 'inner',
'conditions' => 'TableC.tableD_id = TableD.id'
)
)
)
)
. 그러나 그것은 (CakePHP를 그냥 중첩 된 'joins'
종류 내가 기대했던이었다 요소,하지만 슬픈 무시 작동하지 않습니다.
나는 문 빌더를 사용하여) where
절 (하위 쿼리 작업을 수행하는 방법에 대한 의견에서 힌트를 보았다 . 비슷한 트릭은 여기에 사용할 수 있습니다
왜 중첩해야합니까? 최상위 수준에서 모든 조인을 사용하여 동일한 작업을 수행 할 수 있습니까? –
그럴 수는 있지만 그 결과는 달라집니다. 중첩 된 내부 조인에서 선택 데이터를 사용하여 최상위 수준 내부 조인의 모든 결과를 원합니다. 이것을 평평하게하면, 대응하는 TableD가없는 행 (TableA 내부 조인 TableB)이 풀어집니다. –
와우 꽤 복잡합니다. 아마 어떤 방법으로 몇 가지 추가 매개 변수를 추가하는 find()를 시도하고 확장 할 것입니다. –