Questa è una soluzione al mio problema. Risolve il problema utilizzando la funzione PostgreSQL per sostituire il ?
operatore.
Non mi piace molto perché non rende PDO più conforme a PostgreSQL. Ma non ho trovato una vera soluzione.
CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$
SELECT $1 ? $2
$f$;
E ora posso usare la query:
SELECT * FROM post WHERE json_key_exists(locations, :location);
La soluzione alternativa è stata suggerita dal favoloso RhodiumToad di freenode #postgresql
Modifica
Come suggerito da @Abelisto, non è necessario creare la funzione sopra come jsonb_exists(jsonb, text)
è disponibile