yii2tech/filedb

此包已被废弃且不再维护。未建议替代包。

提供静态文件中声明的数据的活动记录接口

资助包维护!
klimov-paul
Patreon

安装数: 80,002

依赖: 11

建议者: 0

安全: 0

星标: 71

关注者: 14

分支: 8

公开问题: 0

类型:yii2-extension

1.0.6 2018-04-09 08:12 UTC

This package is auto-updated.

Last update: 2022-01-10 10:32:35 UTC


README

12951949

为 Yii 2 的文件数据库扩展


此扩展提供了静态文件中声明的数据的活动记录接口。这种解决方案允许通过文件声明静态实体,如组、状态等,这些文件存储在版本控制中,而不是数据库。

注意:虽然此扩展允许写入数据,但不建议这样做。如果您需要复杂的数据存储,请考虑使用基于 SQLite 的常规关系数据库。

有关许可证信息,请参阅 LICENSE 文件。

Latest Stable Version Total Downloads Build Status

安装

安装此扩展的最佳方式是通过 composer

运行

php composer.phar require --prefer-dist yii2tech/filedb

或添加

"yii2tech/filedb": "*"

到您的 composer.json 文件的 require 部分。

用法

此扩展与常规 Yii2 数据库访问层类似。首先,您应将 [[\yii2tech\filedb\Connection]] 组件添加到您的应用程序配置中

return [
    'components' => [
        'filedb' => [
            'class' => 'yii2tech\filedb\Connection',
            'path' => '@app/data/static',
        ],
        // ...
    ],
    // ...
];

现在,您可以通过存储在 '@app/data/static' 路径下的文件来声明实际实体及其数据。默认情况下,使用常规 PHP 代码文件,但您可以通过 [[\yii2tech\filedb\Connection::format]] 选择不同的格式。每个实体都应该有一个对应名称的文件,如 'UserGroup'、'ItemStatus' 等。因此,它们的完整文件名将是 '/path/to/project/data/static/UserGroup.php'、'/path/to/project/data/static/ItemStatus.php' 等。每个文件都应该返回一个包含实际实体数据的数组,例如

// file 'UserGroup.php'
return [
    [
        'id' => 1,
        'name' => 'admin',
        'description' => 'Site administrator',
    ],
    [
        'id' => 2,
        'name' => 'member',
        'description' => 'Registered front-end user',
    ],
];

在文件数据库中,每行数据都应该有一个唯一的字段来标识它 - 主键。其名称由 [[\yii2tech\filedb\Connection::primaryKeyName]] 指定。在这种情况下,您可以在行声明中省略主键,在这种情况下,数据数组中声明的行下的键将用作主键值。因此,前面数据文件示例可以按以下方式重写

// file 'UserGroup.php'
return [
    1 => [
        'name' => 'admin',
        'description' => 'Site administrator',
    ],
    2 => [
        'name' => 'member',
        'description' => 'Registered front-end user',
    ],
];

查询数据

您可以使用 [[\yii2tech\filedb\Query]] 类对在文件中声明的数据进行复杂查询。此类与常规 [[\yii\db\Query]] 类类似,并使用相同的语法。例如

use yii2tech\filedb\Query;

$query = new Query();
$query->from('UserGroup')
    ->limit(10);
$rows = $query->all();

$query = new Query();
$row = $query->from('UserGroup')
    ->where(['name' => 'admin'])
    ->one();

使用 ActiveRecord

此扩展的主要目的是为静态数据提供 ActiveRecord 接口。这是通过 [[\yii2tech\filedb\ActiveRecord]] 和 [[\yii2tech\filedb\ActiveQuery]] 类实现的。特定的 ActiveRecord 类应扩展 [[\yii2tech\filedb\ActiveRecord]] 并重写其 fileName() 方法,指定源数据文件名。例如

class UserGroup extends \yii2tech\filedb\ActiveRecord
{
    public static function fileName()
    {
        return 'UserGroup';
    }
}

注意:默认情况下,fileName() 返回自己的类基础名称(不带命名空间),因此如果您将源数据文件命名为与类基础名称相同,则可以省略重写 fileName() 方法。

[\yii2tech\filedb\ActiveRecord] 与常规的 [[\yii\db\ActiveRecord]] 类似,允许查找、验证和保存模型。它可以与其他 ActiveRecord 类建立关系,这些类通常代表关系型数据库中的实体。例如

class UserGroup extends \yii2tech\filedb\ActiveRecord
{
    public function getUsers()
    {
        return $this->hasMany(User::className(), ['groupId' => 'id']);
    }
}

class User extends \yii\db\ActiveRecord
{
    public function getGroup()
    {
        return $this->hasOne(UserGroup::className(), ['id' => 'groupId']);
    }
}

因此可以执行如下所示的关联查询

$users = User::find()->with('group')->all();
foreach ($users as $user) {
    echo 'username: ' . $user->name . "\n";
    echo 'group: ' . $user->group->name . "\n\n";
}

$adminGroup = UserGroup::find()->where(['name' => 'admin'])->one();
foreach ($adminGroup->users as $user) {
    echo $user->name . "\n";
}