From 0bee52be6254ca4ccb733f39979aeabe5921de2a Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Tue, 8 Nov 2016 09:52:39 +0200 Subject: [PATCH 1/2] Doubel quote MySQL JSON expressions --- .../Database/Query/Grammars/MySqlGrammar.php | 6 +++++- tests/Database/DatabaseQueryBuilderTest.php | 16 ++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 3d1a7e2a22ff..8c455fff0453 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.'"'; + })->toArray(); + + return sprintf('%s->\'$.%s\'', $field, implode('.', $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() From a7f77c577b4c45d39f29d532f0f65b9dcf74d3cc Mon Sep 17 00:00:00 2001 From: Mohamed Said Date: Tue, 8 Nov 2016 16:48:16 +0200 Subject: [PATCH 2/2] use collection implode --- src/Illuminate/Database/Query/Grammars/MySqlGrammar.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php index 8c455fff0453..e5e32f873ef7 100755 --- a/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php +++ b/src/Illuminate/Database/Query/Grammars/MySqlGrammar.php @@ -244,9 +244,9 @@ protected function wrapJsonSelector($value) $path = collect($path)->map(function ($part) { return '"'.$part.'"'; - })->toArray(); + })->implode('.'); - return sprintf('%s->\'$.%s\'', $field, implode('.', $path)); + return sprintf('%s->\'$.%s\'', $field, $path); } /**