tacoberu/domains

PHP DSL,用于查询应用程序层和业务层之间。

v0.3.7 2024-09-14 01:03 UTC

This package is auto-updated.

Last update: 2024-09-14 01:06:28 UTC


README

Build Status

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以返回值
  • 修复命名的参数
  • 元素验证