这是我的查询
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创建此内容?我需要使用子查询吗?
答案 0 :(得分: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');
请注意select()
中输入的explicit binding,you don't get automatic binding此处where()
中的输入,因此您必须自行保管此安全。在外部查询(bind()
)上使用$query
是必要的,因为子查询的绑定正在被抛弃(不确定这是否是一个错误)。
结果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'])