tacoberu / domains
PHP DSL,用于查询应用程序层和业务层之间。
v0.3.7
2024-09-14 01:03 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- php: >=5.3.0
- phpmd/phpmd: ^2.6
- phpstan/phpstan: ^1.6
- phpunit/phpunit: ~4.0
- sstalle/php7cc: ^1.1
- tracy/tracy: 2.*
This package is auto-updated.
Last update: 2024-09-14 01:06:28 UTC
README
PHP DSL,用于查询应用程序层和业务层之间。
受SQL、LINQ或Dibi启发。用于查询数据库、文件、文件系统、XML等。
- with - 我们对哪些数据感兴趣。
- where - 必须在所需数据上满足的条件。
- limit - 我们想要的量。
- offset - 窗口偏移量
- orderByDesc, orderByAsc - 结果排序。
示例
文件查询示例 - 20个小于400B的文件及其内容和信息
Criteria::range('IO/File', 20)
->with('fileInfo')
->with('content')
->where('fileInfo.size <', 400);
Criteria::range('Article', 20)
->with('fileInfo')
->with('content')
->where('fileInfo.size <', 400)
->orderByDesc('fileInfo.size');
Criteria::count('Article')
->with('fileInfo')
->with('content')
->where('fileInfo.size <', 400);
Criteria::first('Article')
->with('fileInfo')
->with('content')
->where('fileInfo.size <', 400);
$f = (new Filter('Album'))
->where('created <', new DateTime())
->where('author.name LIKE', 'Sinead%');
$f = Parser::parseFilter('Album WHERE created < ? AND name LIKE ?', new DateTime(), 'Sinead%');
$repository->range($f);
function range(Filterable $filter = Null, Sortable $sort = Null, $limit = Null, $offset = Null)
{
(new Validation($schema))->assertFilter($filter);
$con = $this->dibi;
foreach ($filter as $name as $args) {
switch($name) {
'author':
$con->leftJoin(...);
break;
}
}
foreach ($filter as $name as $args) {
if ($args instanceof Cond) {
...
}
else {
switch($name) {
'author.name':
$con->where('b.name = ?', $args);
break;
default:
$con->where("a.{$name} = ?", $args);
}
}
}
}
伪代码
-- Posledních pět článků konkrétního uživatele.
article[user.id = 42|limit 5]{*}
-- Všechny kočky, mající více jak 2 černé koťata. Přičemž nás zajímá celkový počet koček, jméno kočky, a barva kočky.
cats[children[color = black]{count} > 2]{children.count, name, color}
-- Patnáct uživatelů z mariánek. U každého chceme krom základních atributů také ulici a město z adresy.
-- Dále chceme pro každého pět (povolených) posledních článků. Z každého článku chceme jen jméno a popis.
users[address.city = "marianky"|limit 15]{*, address{street, city}, article[enabled = true|sort-desc-by date|limit 5]{name, description}}
PHP代码
// Posledních pět článků konkrétního uživatele.
Criteria::range('article', [
Condition::is('user.id', 42),
Range::limit(5)
],
['*']);
// Všechny kočky, mající více jak 2 černé koťata. Přičemž nás zajímá celkový počet koček, jméno kočky, a barva kočky.
// cats[children[color = black]{count} > 2]{children.count, name, color}
// cats[children{count} > 2]{children.count, name, color}
// [children[color = black]{count} > 2]
// [children{count} > 2]
Criteria::range('cat', [
Condition::largerThan(
Criteria::range('cat', []
, 2),
],
['children.count', 'name', 'color']);
// AND
Criteria::range('article', [
Condition::like('user.name', 'Pepa'),
Condition::like('user.name', 'Pavel'),
],
['*']);
// OR
Criteria::range('article', new ConditionOr([
Condition::like('user.name', 'Pepa'),
Condition::like('user.name', 'Pavel'),
]),
['*']);
选择器
用于在标准中选择属性的帮助器
验证器
用于验证标准。我们通过限制客户端可以输入的元素或条件来做到这一点。
格式化器
将标准转换为其他格式。例如,用于dibi、Doctrine等。
待办事项
- 重构名称
- 嵌套查询
- print、deserialize以返回值
- 修复命名的参数
- 元素验证