1
votes

Laravel whereRaw - comment échapper à un '?'

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!


0 commentaires

3 Réponses :


0
votes

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();


2 commentaires

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



0
votes

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 ¯ \ _ (ム„) _ / ¯


0 commentaires

0
votes

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.


0 commentaires