Skip to content

Commit

Permalink
feat(1.5.0): Full rework of jsonWhere with query expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
liqueurdetoile committed Jul 17, 2019
2 parents a1b77f8 + 8daddd9 commit 5776135
Show file tree
Hide file tree
Showing 27 changed files with 1,034 additions and 604 deletions.
29 changes: 16 additions & 13 deletions README.md
Expand Up @@ -172,6 +172,7 @@ $query = $this->Users
'json.sort' => ['created@attributes' => 'DESC']
->all();
```

#### Selecting datfields
It works exactly in the same manner than the `fields` option or the `select` method.

Expand All @@ -198,40 +199,39 @@ $this->Users->find('json')->jsonSelect(['my.key' => 'the.deep.key@attributes'],
// will return ['my' => ['key' => 'deepvalue']]
```

- **Note :** As version >= 1.3.0, you can safely use a dot as a separator or in aliases.

- **Note :** As version >= 1.4.0, you can fetch back an associative array to be directly used in JSON data exchange through API

#### filtering datfields
When using `jsonWhere`, you can use any of regular nesting and operator provided as an array. You can also use plain query. In this last case, string values won't be escaped.

**Note: you can mix "regular" fields from table with JSON field internal data when using `json.conditions` or `jsonWhere`. **
**Note**: you can mix "regular" fields from table with JSON field internal data when using `json.conditions` or `jsonWhere`.

```php
// In your controller
$query = $this->Users
->find('json')
->jsonWhere([
->jsonWhere([ // Classic array way
'OR' => [
'username@attributes =' => 'user'
'prefs.color@attributes LIKE' => '%dark%'
]
]);

// Dangerous raw SQL way
$query = $this->Users
->find('json')
->jsonWhere("username@attributes = 'user' OR prefs.color@attributes LIKE '\"%dark\"'")
```
When using array form, string values will be escaped through PDO prepared query.
->jsonWhere("username@attributes = 'user' OR prefs.color@attributes LIKE '\"%dark\"'");

**At this time, you can't use function callbacks to build complex queries.**

If you're in need, a `JsonQuery` also expose a `jsonExpression` method that will return a core `QueryExpression` that can be latter combined. See API reference for details.
// Query expression way
$query = $this->Users
->find('json')
->jsonWhere(function($q) {
return $q->_or(['username@attributes' => 'user'])->like('prefs.color@attributes', '%dark%');
});
```

#### Sorting datfields
It's exactly the same syntax than `order`|`sort` option or `order` method. If the provided parameter is a string, it will be treated as a default ASC ordering on this field. If the provided parameter is an array of strings, default ASC ordering will also be applied.

**Note: you can mix "regular" fields from table with JSON field internal data when using `json.sort` or `jsonOrder`. **
**Note**: you can mix "regular" fields from table with JSON field internal data when using `json.sort` or `jsonOrder`.

### Create and update JSON in an entity from model
Since v1.1.0, fields names are filtered before marshalling when using `Model::newEntity` or `Model::patchEntity`.
Expand Down Expand Up @@ -287,6 +287,9 @@ $username = $user->jsonGet('attributes')->username;
See [API reference](https://liqueurdetoile.github.io/cakephp-orm-json/)

## Changelog
**v1.5.0**
- Full rework of `jsonWhere` to replace previous conditions array parsing by a full `QueryExpression` build that allows the use of query expressions callbacks

**v1.4.0**
- Add support to optionally fetch back an associative array instead having flattened keys when selecting statements

Expand Down
6 changes: 3 additions & 3 deletions composer.json
Expand Up @@ -3,7 +3,7 @@
"description": "Cakephp plugin to provide easy control over JSON type fields in database",
"type": "cakephp-plugin",
"license": "MIT",
"version": "1.4.2",
"version": "1.5.0",
"authors": [
{
"name": "Liqueur de Toile",
Expand All @@ -30,7 +30,7 @@
],
"require": {
"php": "^7.1",
"cakephp/cakephp": "^3.5",
"cakephp/cakephp": "^3.5|^4",
"adbario/php-dot-notation": "^2.0"
},
"require-dev": {
Expand All @@ -50,7 +50,7 @@
}
},
"scripts": {
"test": "phpunit",
"test": "phpunit && phpstan analyse -l 5 src",
"doc": "php phpDocumentor.phar -d ./src -t ./docs",
"phpstan": "phpstan analyse -l 5 src"
}
Expand Down
30 changes: 15 additions & 15 deletions docs/classes/Lqdt.OrmJson.Model.Behavior.JsonBehavior.html
Expand Up @@ -144,46 +144,46 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle " data-toggle="collapse" data-target="#namespace-1562723033"></a>
<a class="accordion-toggle " data-toggle="collapse" data-target="#namespace-537346934"></a>
<a href="../namespaces/default.html" style="margin-left: 30px; padding-left: 0">\</a>
</div>
<div id="namespace-1562723033" class="accordion-body collapse in">
<div id="namespace-537346934" class="accordion-body collapse in">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-333741668"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1730607253"></a>
<a href="../namespaces/Lqdt.html" style="margin-left: 30px; padding-left: 0">Lqdt</a>
</div>
<div id="namespace-333741668" class="accordion-body collapse ">
<div id="namespace-1730607253" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-768922061"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1651603136"></a>
<a href="../namespaces/Lqdt.OrmJson.html" style="margin-left: 30px; padding-left: 0">OrmJson</a>
</div>
<div id="namespace-768922061" class="accordion-body collapse ">
<div id="namespace-1651603136" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-58096711"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-304131582"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.html" style="margin-left: 30px; padding-left: 0">Model</a>
</div>
<div id="namespace-58096711" class="accordion-body collapse ">
<div id="namespace-304131582" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-821975654"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-312240103"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.Behavior.html" style="margin-left: 30px; padding-left: 0">Behavior</a>
</div>
<div id="namespace-821975654" class="accordion-body collapse ">
<div id="namespace-312240103" class="accordion-body collapse ">
<div class="accordion-inner">


Expand All @@ -198,10 +198,10 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-747609206"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-2120547325"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.Entity.html" style="margin-left: 30px; padding-left: 0">Entity</a>
</div>
<div id="namespace-747609206" class="accordion-body collapse ">
<div id="namespace-2120547325" class="accordion-body collapse ">
<div class="accordion-inner">


Expand All @@ -224,10 +224,10 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-21171591"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-2106523397"></a>
<a href="../namespaces/Lqdt.OrmJson.ORM.html" style="margin-left: 30px; padding-left: 0">ORM</a>
</div>
<div id="namespace-21171591" class="accordion-body collapse ">
<div id="namespace-2106523397" class="accordion-body collapse ">
<div class="accordion-inner">


Expand Down Expand Up @@ -628,7 +628,7 @@ <h1><i class="icon-pushpin"></i></h1>
<section class="span10 offset1">
<hr />
Documentation is powered by <a href="http://www.phpdoc.org/">phpDocumentor </a> and authored
on July 12th, 2019 at 15:21.
on July 17th, 2019 at 00:43.
</section>
</section>
</section>
Expand Down
30 changes: 15 additions & 15 deletions docs/classes/Lqdt.OrmJson.Model.Entity.JsonTrait.html
Expand Up @@ -144,46 +144,46 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle " data-toggle="collapse" data-target="#namespace-162707284"></a>
<a class="accordion-toggle " data-toggle="collapse" data-target="#namespace-1948792008"></a>
<a href="../namespaces/default.html" style="margin-left: 30px; padding-left: 0">\</a>
</div>
<div id="namespace-162707284" class="accordion-body collapse in">
<div id="namespace-1948792008" class="accordion-body collapse in">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-400190243"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-86339689"></a>
<a href="../namespaces/Lqdt.html" style="margin-left: 30px; padding-left: 0">Lqdt</a>
</div>
<div id="namespace-400190243" class="accordion-body collapse ">
<div id="namespace-86339689" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1418194132"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-2065688582"></a>
<a href="../namespaces/Lqdt.OrmJson.html" style="margin-left: 30px; padding-left: 0">OrmJson</a>
</div>
<div id="namespace-1418194132" class="accordion-body collapse ">
<div id="namespace-2065688582" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-652917602"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1359342736"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.html" style="margin-left: 30px; padding-left: 0">Model</a>
</div>
<div id="namespace-652917602" class="accordion-body collapse ">
<div id="namespace-1359342736" class="accordion-body collapse ">
<div class="accordion-inner">

<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1838620374"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1298638637"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.Behavior.html" style="margin-left: 30px; padding-left: 0">Behavior</a>
</div>
<div id="namespace-1838620374" class="accordion-body collapse ">
<div id="namespace-1298638637" class="accordion-body collapse ">
<div class="accordion-inner">


Expand All @@ -198,10 +198,10 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1667792590"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-433776187"></a>
<a href="../namespaces/Lqdt.OrmJson.Model.Entity.html" style="margin-left: 30px; padding-left: 0">Entity</a>
</div>
<div id="namespace-1667792590" class="accordion-body collapse ">
<div id="namespace-433776187" class="accordion-body collapse ">
<div class="accordion-inner">


Expand All @@ -224,10 +224,10 @@
<div class="accordion" style="margin-bottom: 0">
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1150863448"></a>
<a class="accordion-toggle collapsed" data-toggle="collapse" data-target="#namespace-1709166150"></a>
<a href="../namespaces/Lqdt.OrmJson.ORM.html" style="margin-left: 30px; padding-left: 0">ORM</a>
</div>
<div id="namespace-1150863448" class="accordion-body collapse ">
<div id="namespace-1709166150" class="accordion-body collapse ">
<div class="accordion-inner">


Expand Down Expand Up @@ -889,7 +889,7 @@ <h1><i class="icon-pushpin"></i></h1>
<section class="span10 offset1">
<hr />
Documentation is powered by <a href="http://www.phpdoc.org/">phpDocumentor </a> and authored
on July 12th, 2019 at 15:21.
on July 17th, 2019 at 00:43.
</section>
</section>
</section>
Expand Down

0 comments on commit 5776135

Please sign in to comment.