peroks / model-store
模型存储:模型的永久数据存储。
Requires
- php: ^8.1
- peroks/model: ^1.0
Suggests
- ext-mysqli: Required for native MySQL model stores
- ext-pdo: Required for PDO model stores
README
重要:此软件包仍然是实验性的,可能会不通知而更改!
它最初是peroks/model软件包的一部分,但现在已独立出来。由于它不再包含在最新版本的peroks/model
中,我决定即使它还不稳定也要发布。
原因如下
此软件包的目的是永久存储模型。目前支持JSON文件
和MySql数据库
(mysqli和pdo-mysql)。
模型存储是在永久存储之上的一层抽象。它会根据您的模型自动为您创建JSON文件
或数据库模式
。
模型存储提供了一个简单的接口,用于从永久存储中读取模型以及向永久存储中写入模型。
如何使用
存储接口
您当然可以直接访问JSON文件或MySql数据库,但推荐的方式是创建一个存储实例
并使用存储接口。
连接到模型存储
为了连接到模型存储,您必须创建一个新的存储实例
。目前支持三种不同的模型存储:
JsonStore
:JSON文件存储PdoStore
:PDO MySql存储MysqlStore
:原生MySql(mysqli)存储
您也可以创建自己的存储接口实现。
JSON文件存储
将模型存储在JSON文件中仅推荐用于非常小的
数据存储,不超过几MB。它旨在用于开发
和快速原型设计
,但不推荐用于生产
。对于每个PHP请求,完整的JSON文件将被加载到内存中,随着文件的增长,它将消耗越来越多的ram
和cpu
。
要连接到JSON文件存储,只需提供包含您的模型的JSON文件的完整路径和文件名。如果文件不存在,它将被创建。
use Peroks\Model\Store\JsonStore;
$store = new JsonStore( '/<path>/<filename>.json' );
PDO MySql存储
要连接到PDO MySql存储,只需提供MySQL数据库的连接信息。如果不存在具有给定名称的数据库,将创建一个具有该名称的空数据库。
以下所有连接属性都是必需的,除了端口
和套接字
,它们是互斥的。如果主机是localhost
,则期望一个套接字
。连接信息可以是数组
或对象
。
use Peroks\Model\Store\PdoStore;
$store = new PdoStore( [
'host' => 'localhost|<host name>|<ip address>',
'name' => '<db name>',
'user' => '<db username>',
'pass' => '<db password>',
'port' => '<port>',
'socket' => '<socket>',
] );
原生MySql(mysqli)存储
如果您愿意,也可以使用原生的mysqli
驱动程序连接到MySql数据库。只需将存储类PdoStore
替换为MysqlStore
。
use Peroks\Model\Store\MysqlStore;
$store = new MysqlStore( [
'host' => 'localhost|<host name>|<ip address>',
'name' => '<db name>',
'user' => '<db username>',
'pass' => '<db password>',
'port' => '<port>',
'socket' => '<socket>',
] );
创建和更新数据库模式
在使用数据库存储之前,您需要根据模型构建数据库模式。幸运的是,您不需要手动完成这项工作。要创建(并更新)数据库模式,请使用包含您想要存储的所有模型的 模型类名 数组的 build
方法。
use Peroks\Model\Store\MysqlStore;
$store = new MysqlStore( $connection );
$store->build( [
MyModelOne::class,
MyModelTwo::class,
MyModelThree::class,
] );
如果一个模型包含 子模型,则会自动为子模型创建数据库表。您不需要在 build
方法中包含子模型。因此,如果您有模型层次结构,您只需提供您的 顶层 模型。
您只应在创建新的模型存储或模型更改时调用 build
方法。不要每次连接到存储时都调用 build
。
示例
以下示例假设已经创建了模型存储实例,即
use Peroks\Model\Store\MysqlStore;
$store = new MysqlStore( [
'host' => 'localhost|<host name>|<ip address>',
'name' => '<db name>',
'user' => '<db username>',
'pass' => '<db password>',
'port' => '<port>',
'socket' => '<socket>',
] );
所有方法都将 模型类名 作为第一个参数接受。唯一的例外是 set
,因为可以从模型实例推导出类名。
检查模型是否存在于存储中
$exists = $store->exists( MyModelOne::class, 123 );
$exists = $store->exists( MyModelOne::class, 'abc' );
按 id 获取单个模型
$stored_model = $store->get( MyModelOne::class, 123 );
$stored_model = $store->get( MyModelOne::class, 'abc' );
按 id 获取模型列表
$stored_models = $store->list( MyModelOne::class, [123, 'abc', 'xyz'] );
按属性值获取模型
filter
方法返回所有给定 类名 的模型,这些模型匹配属性 id 和其值,即
$stored_models = $store->filter( Artist::class, [
'first_name' => 'Tom',
'last_name' => 'Waits',
] );
按类名获取所有模型
$stored_models = $store->all( Artist::class );
将或更新模型存储中的模型
$model = new Artist( [ 'first_name' => 'Tom', 'last_name' => 'Waits' ] );
$store->set( $model );
从存储中删除模型
$store->delete( MyModelOne::class, 123 );
$store->delete( MyModelOne::class, 'abc' );
安装
您需要 composer 来下载和安装此 包。只需在您的项目中运行 composer require peroks/model-store
即可。