updated readme, new Search helper methods
This commit is contained in:
parent
fc506d38a2
commit
bc3fe54e1c
2 changed files with 45 additions and 14 deletions
33
README.md
33
README.md
|
@ -66,11 +66,37 @@ $obj->undelete();
|
||||||
$obj->delete(true);
|
$obj->delete(true);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Searching
|
||||||
|
|
||||||
|
Factories provide an interface for creating `Search` objects, which allow you to enter in various SQL clauses in a structured and abstract fashion.
|
||||||
|
|
||||||
|
```php
|
||||||
|
// get a new search object from the factory
|
||||||
|
$search = $factory->search();
|
||||||
|
|
||||||
|
// Search::where() takes SQL for the WHERE clause of a query
|
||||||
|
// ${path} syntax is used to reference data within objects, and
|
||||||
|
// works everywhere in searches
|
||||||
|
$search->where('${dso.date.modified} > :time');
|
||||||
|
|
||||||
|
// Search::order() takes SQL to go inside an ORDER BY clause
|
||||||
|
// in the final query.
|
||||||
|
$search->order('${dso.date.modified} desc');
|
||||||
|
|
||||||
|
// Search limit/offset methods can be used for pagination
|
||||||
|
// there is also a paginate() method for more conveniently
|
||||||
|
// paginating results
|
||||||
|
$search->paginate(20,1);
|
||||||
|
|
||||||
|
// Search::execute() returns an array of the resulting objects
|
||||||
|
$results = $search->execute();
|
||||||
|
```
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
This system relies **heavily** on the JSON features of the underlying database.
|
This system relies **heavily** on the JSON features of the underlying database.
|
||||||
This means it cannot possibly run without a database that supports JSON features.
|
This means it cannot possibly run without a database that supports JSON features.
|
||||||
Exact requirements are in flux during development, but basically if a database doesn't have JSON functions it's probably impossible for Destructr to ever work with it.
|
Basically if a database doesn't have JSON functions it's probably impossible for Destructr to ever work with it.
|
||||||
|
|
||||||
At the moment there is pretty decent support for:
|
At the moment there is pretty decent support for:
|
||||||
|
|
||||||
|
@ -85,11 +111,6 @@ In practice this means Destructr will **never** be able to run on less than the
|
||||||
* PostgreSQL >=9.3
|
* PostgreSQL >=9.3
|
||||||
* SQL Server >=2016
|
* SQL Server >=2016
|
||||||
|
|
||||||
There is also a SQLite driver available that inserts a PHP JSON function.
|
|
||||||
It doesn't support generated columns, so its indexing and optimization capabilities are limited.
|
|
||||||
Nevertheless, SQLite can be reasonably performant for many smaller/simpler applications.
|
|
||||||
For more information see [the legacy drivers readme](src/LegacyDrivers/README.md).
|
|
||||||
|
|
||||||
Theoretically Destructr is also an excellent fit for NoSQL databases.
|
Theoretically Destructr is also an excellent fit for NoSQL databases.
|
||||||
If I ever find myself needing it there's a good chance it's possible to write drivers for running it on something like MongoDB as well.
|
If I ever find myself needing it there's a good chance it's possible to write drivers for running it on something like MongoDB as well.
|
||||||
It might even be kind of easy.
|
It might even be kind of easy.
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
namespace Destructr;
|
namespace Destructr;
|
||||||
|
|
||||||
use Destructr\DSOFactoryInterface;
|
use Destructr\DSOFactoryInterface;
|
||||||
use Destructr\Drivers\DSODriverInterface;
|
|
||||||
|
|
||||||
class Search implements \Serializable
|
class Search implements \Serializable
|
||||||
{
|
{
|
||||||
|
@ -13,12 +12,12 @@ class Search implements \Serializable
|
||||||
protected $limit;
|
protected $limit;
|
||||||
protected $offset;
|
protected $offset;
|
||||||
|
|
||||||
public function __construct(DSOFactoryInterface $factory=null)
|
public function __construct(DSOFactoryInterface $factory = null)
|
||||||
{
|
{
|
||||||
$this->factory = $factory;
|
$this->factory = $factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function quote(string $str) : string
|
public function quote(string $str): string
|
||||||
{
|
{
|
||||||
return $this->factory->quote($str);
|
return $this->factory->quote($str);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +32,7 @@ class Search implements \Serializable
|
||||||
return $this->factory->executeSearch($this, $params, $deleted);
|
return $this->factory->executeSearch($this, $params, $deleted);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function where(string $set = null) : ?string
|
public function where(string $set = null): ?string
|
||||||
{
|
{
|
||||||
if ($set !== null) {
|
if ($set !== null) {
|
||||||
$this->where = $set;
|
$this->where = $set;
|
||||||
|
@ -41,7 +40,18 @@ class Search implements \Serializable
|
||||||
return $this->where;
|
return $this->where;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function order(string $set = null) : ?string
|
public function paginate(int $perPage, int $page = 1)
|
||||||
|
{
|
||||||
|
$this->limit($perPage);
|
||||||
|
$this->offset(($page - 1) * $perPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pageCount(int $perPage)
|
||||||
|
{
|
||||||
|
return ceil($this->count() / $perPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function order(string $set = null): ?string
|
||||||
{
|
{
|
||||||
if ($set !== null) {
|
if ($set !== null) {
|
||||||
$this->order = $set;
|
$this->order = $set;
|
||||||
|
@ -49,7 +59,7 @@ class Search implements \Serializable
|
||||||
return $this->order;
|
return $this->order;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function limit(int $set = null) : ?int
|
public function limit(int $set = null): ?int
|
||||||
{
|
{
|
||||||
if ($set !== null) {
|
if ($set !== null) {
|
||||||
$this->limit = $set;
|
$this->limit = $set;
|
||||||
|
@ -57,7 +67,7 @@ class Search implements \Serializable
|
||||||
return $this->limit;
|
return $this->limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function offset(int $set = null) : ?int
|
public function offset(int $set = null): ?int
|
||||||
{
|
{
|
||||||
if ($set !== null) {
|
if ($set !== null) {
|
||||||
$this->offset = $set;
|
$this->offset = $set;
|
||||||
|
@ -68,7 +78,7 @@ class Search implements \Serializable
|
||||||
public function serialize()
|
public function serialize()
|
||||||
{
|
{
|
||||||
return json_encode(
|
return json_encode(
|
||||||
[$this->where(),$this->order(),$this->limit(),$this->offset()]
|
[$this->where(), $this->order(), $this->limit(), $this->offset()]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue