updated readme, new Search helper methods

This commit is contained in:
Joby 2020-08-28 09:36:21 -06:00
parent fc506d38a2
commit bc3fe54e1c
2 changed files with 45 additions and 14 deletions

View file

@ -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.

View file

@ -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()]
); );
} }