簡體   English   中英

將原始查詢轉換為CakePHP 3.x中的查詢生成器

[英]Translate raw query into Query Builder in 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之類的第二個變量替換。

如何使用查詢生成器創建此文件? 我需要使用子查詢嗎?

是的,您可以對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');

注意select()輸入的顯式綁定 ,在這里您不會where()那樣獲得自動綁定 ,因此您必須確保自己的安全。 有必要在外部查詢( $query bind()上使用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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM