是的,你可以使用子查詢的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的輸入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'])
來源
2015-02-09 07:05:42
ndm
我被甩出通過綁定語句。你可以在第一個代碼塊中使用綁定而不是鑄造? – 2015-02-09 07:53:12
@KimStacks重組我的答案。 – ndm 2015-02-09 08:32:32
真棒的答案。謝謝ndm – 2015-02-09 12:13:52