将原始查询转换为CakePHP 3.x中的查询生成器

时间:2015-02-09 05:51:37

标签: php cakephp cakephp-3.0

这是我的查询

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 个答案:

答案 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 bindingyou 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'])