Existe-t-il un moyen d'échapper à un "?" dans une déclaration éloquente whereRaw? (Utilisation de laravel 6.x)
exemple:
where "table"."json_field"::jsonb $1| array['test', 'test2']
Cela est envoyé à la base de données comme
ExampleModel::whereRaw(' "table"."json_field"::jsonb ?| array[\'test\', \'test2\'] ')->get();
Et bien, ce n'est pas ce que je voulais interroger ...
Essayé avec '\?', Mettez-le dans une reliure ( Laravel doc ) - toujours pas de succès. De plus, je n'ai pas trouvé de référence dans la documentation ...
Dans mon cas d'utilisation, je veux qu'il compare un objet json avec le psql en comparant "? |" ( Postgres Doc )
Merci d'avance!
3 Réponses :
Je n'ai pas testé mais j'ai essayé d'utiliser PDO:
$whereRaw = DB::connection()->getPdo()->quote(' "table"."json_field"::jsonb ?| array["test", "test2"] '); ExampleModel::whereRaw($whereRaw)->get();
malheureusement ne fonctionne pas, maintenant le whereRaw est inséré avec "trop de guillemets": select * from table where ' "table"."json_field"::jsonb ?| array[''test'', ''test2''] '
déjà essayé, mais ce n'est pas la citation que nous recherchons ;-) Le guillemet d'échec est après la clause where: [...]where *'* "table"."json[...]
@edit les étoiles "mettent en évidence" la qoute défaillante
Eh bien, je n'ai pas trouvé de réponse, mais une solution de contournement:
N'utilisez pas les opérateurs de point d'interrogation!
Au lieu de cela, je suis allé pour la fonction nommée. J'ai trouvé la fonction nommée via
ExampleModel::whereRaw('jsonb_exists_any("table"."json_field"::jsonb, array[\'test\', \'test2\'])')->get();
(Trouvé là-bas: un grand merci à ce post de gars! )
Donc ma requête Eloquent ressemble maintenant à:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
Au moins son fonctionnement ¯ \ _ (ム„) _ / ¯
la question est assez ancienne mais ma réponse pourrait quand même aider.
La solution est très simple: il suffit d'échapper au point d'interrogation avec un autre point d'interrogation.
Le code de votre exemple ressemblerait à ceci:
ExampleModel::whereRaw(' "table"."json_field"::jsonb ??| array[\'test\', \'test2\'] ')->get();
Cette solution a été testée avec Laravel 7.28.3.