将原始查询转换为 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 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'])
这是我的查询
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 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'])