Esta é uma solução para o meu problema. Ele resolve o problema usando a função PostgreSQL para substituir o
?
operador. Não gosto muito porque não torna o PDO mais compatível com o PostgreSQL. Mas não encontrei nenhuma solução real.
CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$
SELECT $1 ? $2
$f$;
E agora posso usar a consulta:
SELECT * FROM post WHERE json_key_exists(locations, :location);
A solução alternativa foi sugerida pelo fabuloso RhodiumToad da freenode #postgresql
Editar
Como @Abelisto sugeriu, não há necessidade de criar a função acima como
jsonb_exists(jsonb, text)
é avialabe