2016-06-12 15 views
0

Я новичок в Cakephp 3.x, и у меня возникли проблемы с созданием подзапроса в новом формате ORM. У меня есть этот отчет в моем приложении, который должен вернуть результат:
1. Есть три объекта - пользователи, звонки, CallStatus.
2. Пользователи имеют много звонков, звонков hasMany CallStatus.
3. Мне нужно подсчитать, сколько CallStatus имеет каждый пользователь в Calls.
Теперь выполните запрос, что мне нужно поставить на новый формат ОРМ:Подзапросы в 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

Если вы правильно поняли, вы хотите увидеть количество вызовов для каждого номера звонка, который у вас есть для определенного пользователя.

Попробуйте следующее. Обратите внимание, что я использовал соглашение CakePHP для именования callstatuses (что является множественным числом).

// 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 в этом случае.