2016-12-30 41 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' 

虛擬域根本不被識別。 我做錯了什麼?

更新: 我發現我不得不這樣稱呼它:

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