2015-02-09 77 views
0

這是我的查詢翻譯原始查詢到查詢生成器CakePHP中3.X

INSERT INTO users_access_dynamic_views (dynamic_view_id, user_id, ordinal_ranking) 
SELECT ?, u.user_id, COUNT(uav.id) + 1 from users_access_dynamic_views uav 
    RIGHT JOIN users_in_circles u ON uav.user_id = u.user_id 
WHERE u.circle_id = ? 
GROUP BY u.user_id 

第一?應該像$viewId一個PHP變量,第二次由$circleId所取代。

如何使用Query Builder來創建?我需要使用子查詢嗎?

回答

1

是的,你可以使用子查詢的SELECT部分,並把它傳遞到Query::values(),是這樣的:

$values = $connection 
    ->newQuery() 
    ->select([':viewId', 'u.user_id', 'COUNT(uav.id) + 1']) 
    ->from(['uav' => 'users_access_dynamic_views']) 
    ->rightJoin(['u' => 'users_in_circles'], ['uav.user_id = u.user_id']) 
    ->where(['u.circle_id' => $circleId]) 
    ->group('u.user_id'); 

$query = $connection 
    ->newQuery() 
    ->insert(['dynamic_view_id', 'user_id', 'ordinal_ranking']) 
    ->into('users_access_dynamic_views') 
    ->values($values); 

$query->bind(':viewId', $viewId, 'type'); 

注意explicit binding的輸入select()you don't get automatic binding這裏爲where(),讓你擁有自己保持安全。在外部查詢($query)上使用bind()是必要的,因爲子查詢的綁定正在被放棄(不確定這是否是一個錯誤)。

產生的SQL:

INSERT INTO 
    users_access_dynamic_views (dynamic_view_id, user_id, ordinal_ranking) 
SELECT 
    :viewId, u.user_id, COUNT(uav.id) + 1 
FROM 
    users_access_dynamic_views uav 
RIGHT JOIN 
    users_in_circles u ON uav.user_id = u.user_id 
WHERE 
    u.circle_id = :c0 
GROUP BY 
    u.user_id 

萬一值$viewId是一些簡單的像一個數值,你當然可以簡單地直接投它,而不是使用綁定:

->select([(int)$viewId, 'u.user_id', 'COUNT(uav.id) + 1']) 
+0

我被甩出通過綁定語句。你可以在第一個代碼塊中使用綁定而不是鑄造? – 2015-02-09 07:53:12

+0

@KimStacks重組我的答案。 – ndm 2015-02-09 08:32:32

+0

真棒的答案。謝謝ndm – 2015-02-09 12:13:52