将原始查询转换为 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

第一个 ? 应替换为 PHP 变量,如 $viewId,第二个 $circleId

如何使用 Query Builder 创建它?我需要使用子查询吗?

是的,您可以为 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 for the input in select(), you don't get automatic bindingwhere() 中的一样,因此您必须自行保管好它。有必要在外部查询 ($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'])