2016-06-12 13 views
0

私はCakephp 3.xで新しく、新しいORM形式でサブクエリを作成するのにいくつか問題があります。私はこのレポートを私のアプリケーションに持っています。その結果は、結果を返す必要があります:
1.ユーザー、コール、CallStatusという3つのエンティティがあります。
2.ユーザーは多数の通話を持ち、通話はhasMany CallStatusを持ちます。
3.私は、各ユーザがCalls内にどれくらい多くのCallStatusを数えているかを知る必要があります。
は今、私は新しいORMフォーマットを置くために必要なクエリは、次のとおりcakephp 3.xのサブクエリ、新しいORM?

SELECT U.name, 
    (SELECT COUNT(*) FROM calls as C WHERE C.call_status_id =1 and C.user_id=U.id) AS 'Unavailable', 
    (SELECT COUNT(*) FROM calls as C WHERE C.call_status_id =2 and C.user_id=U.id) AS 'Busy', 
    (SELECT COUNT(*) FROM calls as C WHERE C.call_status_id =3 and C.user_id=U.id) AS 'Contacted', 
    (SELECT COUNT(*) FROM calls as C WHERE C.call_status_id =4 and C.user_id=U.id) AS 'Error' 
FROM `users` AS U 
WHERE U.profile=3 and U.is_active=1 

は誰かが、私に助けをしてください与えてもらえますか?ありがとう

答えて

0

私が正しく理解していれば、あなたは特定のユーザに対して持っているすべてのcallstatusの呼び出し回数を知りたいと思う。

以下を試してください。 callstatuses(複数形)の命名にCakePHPの規約を使用しています。

// get the tableregistry 
use Cake\ORM\TableRegistry; 
$callstatuses = Cake\ORM\TableRegistry::get('Callstatuses'); 

// for user with id 2, get the number of calls for each callstatus 
$callstatuses->find() 
    ->contain(['Calls']) 
    ->where(['Calls.user_id' => 2, 'User.is_active' => 1]) 
    ->countBy('name') 
    ->toArray(); 

// output could be: 
//[ 'Unavailable' => 2, 'Busy' => 1 ] 

あなたはCakePHPの本の中でクエリの作成についての情報を見つけることができます:あなたがクエリに/での作業についての詳細をお知りになりたい場合は、クエリがコレクションされていることに注意し、'Query Builder'.

を参照してください。 Collectionオブジェクトで実行できることは何でも、Queryオブジェクトで行うこともできます。 Collection section in the CakePHP bookを参照してください。

0

必要なだけサブクエリを使用する必要があります。 はここにあなたの場合の例です。

$q = $this->Calls->find(); 


$q1->select([$q->func()->count('*')]) 
     ->where(['Calls.user_id = Users.id', 'call_status_id' => 1]); 

$q2->select([$q->func()->count('*')]) 
     ->where(['Calls.user_id = Users.id', 'call_status_id' => 2]); 

$q3->select([$q->func()->count('*')]) 
     ->where(['Calls.user_id = Users.id', 'call_status_id' => 3]); 

$q4->select([$q->func()->count('*')]) 
     ->where(['Calls.user_id = Users.id', 'call_status_id' => 4]); 

$qUsers = $this->Users->find() 
     ->select([ 
       'id', 
       'first_name', 
       'Unavailable' => $q1, 
       'Busy' => $q2, 
       'Contacted' => $q3, 
       'Error' => $q4 
     ]) 
     ->where(['profile' => 3, 'active' => 1]) 
     ->all(); 

注:このケースでsuqueriesを作成するためにループを使用する場合よりよいこと。

関連する問題