2016-12-30 1 views
0

후 나는이 발견 문을 생성하지만 예상대로 작동하지 않는 몇 가지 조사 :CakePHP의 3.x를 하위 선택

public $virtualFields = array(
    'count' => "SELECT COUNT(plans_trainings.id) FROM plans_trainings, trainings, projects WHERE plans_trainings.training_id = trainings.id AND projects.location_id = locations.id AND plans_trainings.project_id = projects.id" 
); 

public function trainingsPerLocationChartData(){ 
$this->loadModel('Locations'); 
$locationsDiagramData = $this->Locations->find('all', array(
      'fields' => array(
       'locations.id', 
       'locations.description', 
       'locations.count' /* virtuel field */ 
      ) 
     )); 

성명은 다음과 같이 표시됩니다

'sql' => 'SELECT locations.id AS `locations__id`, locations.description AS `locations__description`, locations.count AS `locations__count` FROM locations Locations' 

가상 필드가 전혀 인식되지 않습니다. 내가 뭘 잘못 했니?

UPDATE :

'count' => "(SELECT COUNT(plans_trainings.id) FROM plans_trainings, trainings, projects WHERE plans_trainings.training_id = trainings.id AND projects.location_id = locations.id AND plans_trainings.project_id = projects.id) AS `counter`" 

내가()로 추가 된 선택 주위 : 은 내가 같이 호출 할 필요가 있음을 발견했다.

$locationsDiagramData = $this->Locations->find('all') 
      ->select(['locations.id', 'locations.description', $this->virtualFields['count']]); 

하지만 여전히 잘못된 SQL 구문 얻을 :

SELECT locations.id AS `locations__id`, locations.description AS `locations__description`, (SELECT COUNT(plans_trainings.id) FROM plans_trainings, trainings, projects WHERE plans_trainings.training_id = trainings.id AND projects.location_id = locations.id AND plans_trainings.project_id = projects.id) AS `counter` AS (SELECT COUNT(plans_trainings__id) FROM plans_trainings, trainings, projects WHERE plans_trainings FROM locations Locations 

"마지막"문제는 AS counter 이후에만이 부분을 보인다 :

AS (SELECT COUNT (plans_trainings__id) FROM을 계획 _ 교육, 교육, 프로젝트 계획 _ 경로 계획

이것은 성명을 어기는 것입니다! 아이디어를 해결하는 방법은 무엇입니까? phpmyadmin에서 명령문을 실행하고 언급 된 부분을 제거하면 명령문이 올바르게 작동하고 올바른 결과를 얻을 수 있습니다!

업데이트 2 : 이 일반 성명 :

select 
       locations.id, 
    locations.description, 
    (
           select 
               count(plans_trainings.id) 
           from 
               plans_trainings, 
      trainings, 
      projects 
           where 
               plans_trainings.training_id = trainings.id 
               and projects.location_id = locations.id 
               and plans_trainings.project_id = projects.id 
    ) as 'Anzahl' 
from 
       locations; 
+0

CakePHP의 3에는 가상 필드는 더 이상 없다 ... [적절한를 사용하는 컨트롤러에이 시도 ** 하위 쿼리 **] (http://book.cakephp.org/3.0/en/orm/query-builder.html#subqueries)를 선택하고 [**'select()'**] (http : // book. cakephp.org/3.0/en/orm/query-builder.html#selecting-data). – ndm

답변

2

$this->loadModel('Locations'); 
$this->loadModel('PlansTrainings'); 
$this->loadModel('Trainings'); 
$this->loadModel('Projects'); 
$sub_query=$this->PlansTrainings->find()->select(['cnt1'=>'count(PlansTrainings.id)'])->join([ 
     [ 
      'table' => 'trainings', 
      'alias' => 'Trainings', 
      'type' => 'INNER', 
      'conditions' => 'PlansTrainings.training_id=Trainings.id', 
     ], 
     [ 
      'table' => 'projects', 
      'alias' => 'Projects', 
      'type' => 'INNER', //LEFT, RIGHT... 
      'conditions' => ['Projects.location_id=PlansTrainings.id','PlansTrainings.project_id=Projects.id'], 
     ], 
]); 
$locationsDiagramData = $this->Locations->find()->select(['id', 'description','count'=>$sub_query]);