yii2tech / filedb
提供静态文件中声明的数据的活动记录接口
Requires
- yiisoft/yii2: ~2.0.14
README
为 Yii 2 的文件数据库扩展
此扩展提供了静态文件中声明的数据的活动记录接口。这种解决方案允许通过文件声明静态实体,如组、状态等,这些文件存储在版本控制中,而不是数据库。
注意:虽然此扩展允许写入数据,但不建议这样做。如果您需要复杂的数据存储,请考虑使用基于 SQLite 的常规关系数据库。
有关许可证信息,请参阅 LICENSE 文件。
安装
安装此扩展的最佳方式是通过 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"; }