sharkodlak / fluentdb
Fluent DB 提供了一个高性能的数据库层,拥有易于使用的 fluent 接口。
Requires
- php: >=5.6.13
- ext-pdo: *
- psr/cache: *
- sharkodlak/exception: *
Requires (Dev)
- pdepend/pdepend: *
- phploc/phploc: *
- phpmd/phpmd: *
- phpunit/phpunit: *
- sebastian/phpcpd: *
- sharkodlak/coding-style: *
- squizlabs/php_codesniffer: *
- tedivm/stash: *
- theseer/phpdox: *
Suggests
- ext-pgsql: PostgreSQL PDO module.
This package is auto-updated.
Last update: 2024-09-06 06:55:44 UTC
README
Fluent DB 提供了一个高性能的数据库层,拥有易于使用的 fluent 接口。它受到了 NotORM 和 DibiFluent 的启发。
使用 table film
$db->film
从 table language 中选择所有列和所有行
$db->language->getQuery()->getResult()->fetchAll()
从 table actor 中选择所有行,但让库只选择必要的列
foreach ($db->actor as $actor) {
$actorName = $actor['first_name'] . ' ' . $actor['last_name'];
}
在上一个例子中,仅会自动选择 actor_id(作为表的主键)、first_name 和 last_name 列(在连续调用的情况下,如果缓存命中)。
要获取引用的表行,只需从行中获取表名。库使用 Structure\Convention->foreignKey()
作为来源来匹配通过 Structure\Convention->primaryKey()
识别的引用表主键。
$row->language
要获取引用表而不是引用表的值,请使用列名。
$row['language_id']
通过指定的列获取引用表中找到的对应行。方法 Table->via()
指定从源表和可选的引用表中使用的列。此方法返回一行。要找到引用此值的哪些行,应使用方法 Table->backwards()
。此方法接受可选参数以指定来自第二表的列名(默认为引用第一表的外键)以及要在第一表中匹配的列名(默认为主键)——因此这些参数的顺序与 Table->via()
中的参数顺序相反。此方法返回对应行的集合。
foreach ($db->directory as $directory) {
$parentDirectory = $directory->directory->via('parent_id');
$subDirectories = $directory->directory->backwards('parent_id');
}
行充当数组,它可以被迭代,方法 toArray
返回所有列和值。
$row['name']; // Array access to column named 'name'
foreach ($row as $columnName => $value) { // Iterate over all columns
$columnName . ': ' . $value;
}
$row->toArray(); // Get all columns as array
也可以从由其 id 定义的表中获取一行。
$row = $db->film[$id]
要过滤从数据库中检索的行,请使用方法 where。
$db->film->where('release_year BETWEEN %s AND %s', 2001, 2008);
如果合理,将来要实现的功能
通过另一个表中的数据过滤行
// Select all movies in German language
// SELECT film.* FROM film JOIN language USING (language_id) WHERE language.name = 'German'
$db->film->language->where('name = %s', 'German');
// Select actors having at least 3 films
// SELECT actor_id FROM film_actor GROUP BY actor_id HAVING COUNT(film_id) >= 30
$actorsHavingALotOfFilms = $db->film_actor->groupBy(̈́'actor_id')->having('COUNT(film_id) >= 30');
$db->actor->where(':id IN (%s)', $actorsHavingALotOfFilms);
可以在不知道列名的情况下获取引用列的值,需要的是表名。由于延迟加载,这没有性能影响。仅当使用除主键列之外的列时,才会从引用表中执行选择。此功能仅在数据库具有一致的引用完整性时才有效,因为它模拟在引用表中匹配行。
// Typical use is $row['language_id']
$row->language[':id']
引用方法接受数组参数,以允许通过复合键引用表。
$row->target->via(['lang_id', 'second_id'], ['lang_id', 'second_id']);
$row->target->backwards(['lang_id', 'second_id'], ['lang_id', 'second_id']);
引用方法还接受第三个参数,即比较函数。默认情况下是相等函数,但可以使用更复杂的函数。
$between = function($rowColumnValue, $tableColumnValue) {
...
return $inBetween;
}
$row->target->via(null, null, $between);