Sign up ×
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other. Join them, it only takes a minute:

I've got this data in a JSONB field:

[
    'first_name' => 'Philipp',
    'last_name' => 'Kühn',
    'size' => 170,
    'hobbies' => [
      'daily' => 'beer',
    ],
    'skills' => [
      'drink beer',
      'drink more beer',
    ],
]

I'm pretty new to Laravel and Postgres so I wanted to do some basic queries.

Here are some queries that works fine: (json is the name of the column)

$users = User::whereRaw("json ->> 'first_name' = 'Philipp'")->get();

$users = User::whereRaw("json ->> 'size' > '160'")->get();

$users = User::whereRaw("json #>> '{hobbies, daily}' = 'beer'")->get();

Now I want to check if drink beer is in skills and the following code doesn't work:

$users = User::whereRaw("json -> 'skills' ? 'drink beer'")->get();

Here I got a syntax error:

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1"
LINE 1: select * from "users" where json ->> 'skills' $1 'drink beer...
^ (SQL: select * from "users" where json ->> 'skills' ? 'drink beer')

How can I search for drink beer?

share|improve this question
1  
Hu ho, it sounds PDO is taking the question mark as being a query parameter… Look at the documentation : positional parameters : php.net/manual/en/pdostatement.bindparam.php No idea how to get around this. – greg Aug 27 at 11:48
    
yes. this seems to be the problem. i've tested a raw query in postico and everything worked. argh... – Philipp Kühn Aug 27 at 11:57
1  
what about stackoverflow.com/a/16312053/244058 ? – Florian Aug 27 at 12:28

1 Answer 1

up vote 1 down vote accepted

As suggested by @tapoueh on twitter, maybe a work around would be to use the operator's underlying function: jsonb_exists(jsonb, text). So your query would be

$users = User::whereRaw("jsonb_exists(json -> 'skills', 'drink beer'")->get();

Added by @docteur_klein : A link to a similar problem.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.