2016-11-11 1 views
0

Wie kann ich konvertieren Mysql Abfrage:Subqueries in CakePHP 3.0

SELECT * , (

SELECT COUNT(*) 
FROM articles 
WHERE `user_id` =1 
) AS total_count 
FROM articles 
WHERE `user_id` =1 
GROUP BY user_id 

in cakephp Unterabfrage?

ich dies versucht haben,

$articlescount = $this->Articles->find('all')->where(['user_id' => 1])->count(); 
print_r($articlescount); 

Was mich nur nicht der Anzahl zurückgibt.

Antwort

1

Ich habe Zweifel, dass die Abfrage, die Sie verwenden, ist der beste Weg, zu tun, was Sie erreichen wollen, da scheint es, dass die Abfrage und die Unterabfrage zurückgeben den gleichen Wert

Wie auch immer das ist, wie Sie das erhalten gleiche genaue Abfrage gefragt Sie

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

$q->select([$q->func()->count('*')]) 
    ->where(['user_id' => 1]); 

$q2 = $this->Users->find() 
    ->select(['total_count' => $q]) 
    ->autoFields(true) 
    ->where(['user_id' => 1]) 
    ->group(['user_id']) 
    ->all(); 

$q die Unterabfrage ist, während $q2 die eigentliche Abfrage ist Sie wollen.

Durch die Art und Weise denke ich, dass man einfach

$q = $this->Users->find() 
    ->select(['total_count' => $q->func()->count('*')]) 
    ->autoFields(true) 
    ->where(['user_id' => 1]) 
    ->group(['user_id']); 
0

Ariala Kommentar des fast gut tun könnte, aber ich denke, dieser Code ist flexibler, weil die suquery Benutzer-ID festen Zustand nicht enthält, ist:

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

$q->select([$q->func()->count('*')]) 
     ->where(['Articles.user_id = Users.id']); 

$q2 = $this->Users->find() 
     ->select(['id', 'first_name', 'total_count' => $q]) 
     ->where(['id' => 1]) 
     ->all(); 

Wenn Sie jedoch alle Benutzer mit Artikelanzahl auflisten möchten, können Sie das tun, wenn Sie die Where-Bedingung von $ q2 belassen.

Es werden die Ergebnisse wie folgt aus:

id | first_name | total_count 
1 | John  | 3 
2 | Doe  | 0