diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 3d1a7e2a22ff..e5e32f873ef7 100755 --- a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -242,7 +242,11 @@ protected function wrapJsonSelector($value) $field = $this->wrapValue(array_shift($path)); - return $field.'->'.'"$.'.implode('.', $path).'"'; + $path = collect($path)->map(function ($part) { + return '"'.$part.'"'; + })->implode('.'); + + return sprintf('%s->\'$.%s\'', $field, $path); } /** diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index 7356a3b44d0d..2ee688aad6ba 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1408,7 +1408,7 @@ public function testMySqlWrappingJsonWithString() { $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->sku', '=', 'foo-bar'); - $this->assertEquals('select * from `users` where `items`->"$.sku" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."sku"\' = ?', $builder->toSql()); $this->assertCount(1, $builder->getRawBindings()['where']); $this->assertEquals('foo-bar', $builder->getRawBindings()['where'][0]); } @@ -1417,28 +1417,28 @@ public function testMySqlWrappingJsonWithInteger() { $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->price', '=', 1); - $this->assertEquals('select * from `users` where `items`->"$.price" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."price"\' = ?', $builder->toSql()); } public function testMySqlWrappingJsonWithDouble() { $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->price', '=', 1.5); - $this->assertEquals('select * from `users` where `items`->"$.price" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."price"\' = ?', $builder->toSql()); } public function testMySqlWrappingJsonWithBoolean() { $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->available', '=', true); - $this->assertEquals('select * from `users` where `items`->"$.available" = true', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."available"\' = true', $builder->toSql()); } public function testMySqlWrappingJsonWithBooleanAndIntegerThatLooksLikeOne() { $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->available', '=', true)->where('items->active', '=', false)->where('items->number_available', '=', 0); - $this->assertEquals('select * from `users` where `items`->"$.available" = true and `items`->"$.active" = false and `items`->"$.number_available" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."available"\' = true and `items`->\'$."active"\' = false and `items`->\'$."number_available"\' = ?', $builder->toSql()); } public function testMySqlWrappingJson() @@ -1449,15 +1449,15 @@ public function testMySqlWrappingJson() $builder = $this->getMySqlBuilder(); $builder->select('items->price')->from('users')->where('items->price', '=', 1)->orderBy('items->price'); - $this->assertEquals('select `items`->"$.price" from `users` where `items`->"$.price" = ? order by `items`->"$.price" asc', $builder->toSql()); + $this->assertEquals('select `items`->\'$."price"\' from `users` where `items`->\'$."price"\' = ? order by `items`->\'$."price"\' asc', $builder->toSql()); $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->price->in_usd', '=', 1); - $this->assertEquals('select * from `users` where `items`->"$.price.in_usd" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."price"."in_usd"\' = ?', $builder->toSql()); $builder = $this->getMySqlBuilder(); $builder->select('*')->from('users')->where('items->price->in_usd', '=', 1)->where('items->age', '=', 2); - $this->assertEquals('select * from `users` where `items`->"$.price.in_usd" = ? and `items`->"$.age" = ?', $builder->toSql()); + $this->assertEquals('select * from `users` where `items`->\'$."price"."in_usd"\' = ? and `items`->\'$."age"\' = ?', $builder->toSql()); } public function testPostgresWrappingJson()