平面文件键对象NoSQL数据库

0.2.1 2014-05-01 10:38 UTC

This package is auto-updated.

Last update: 2024-09-15 22:09:10 UTC


README

CKDB是一个针对PHP脚本的键对象平面文件数据库

使用它

  • 适用于小型快速网站,数据模型简单
  • 如果没有外部数据库可用(例如免费网络空间)
  • 当需要小型基于对象的数据库且无需复杂配置时
  • 用于快速在不同Web服务器之间复制

特性

  • 易于配置
  • 映射实体类,无需修改它们
  • 基于键对象
  • 类关系
  • 默认数据库函数用于插入、更新、删除对象
  • 仓库用于按属性值或范围选择,按属性排序
  • 快速索引文件
  • 因为每个实体一个文件,所以可以并行访问不同实体的写入

安装

您可以使用require方法手动安装脚本

require 'CKDB.php';
  • 为数据库目录(在配置中为'databasepath')添加写权限
  • 检查网络空间,因为基于文件的存储数据需要空间

部署

将脚本包含到您的项目中,无论是使用Composer还是通过手动require方法,并在需要时使用适当的参数创建类的实例

$em = new CKDB($config);

配置

设置

  • 要持久化到数据库中的实体类的路径数组(未选择的实体将不会作为单独的记录保存到数据库中)
  • 数据库路径(检查脚本的写权限)。每个实体都有自己的存储子目录
  • 压缩已启用(尚未实现)
$config = array(
    'entitypaths' => array('path/to/your/entities'),
    'databasepath' => 'database',
    'compression' => 1,
);

$em = new CKDB($config);

配置您的数据模型

以下定义的类属性将被添加到数据库索引中。

为数组中的每个类定义一个主键

$primkeys = array(
    'User' => 'id'
);
$em->setPrimaryKeys($primkeys);

定义您希望在选择和排序函数中使用的外键。数组中的每个值都是实体'User'中的一个字段

$forkeys = array(
    'User' => array('id', 'firstname', 'email')
);
$em->setForeignKeys($forkeys);

定义属性所引用的类。在数据库索引中将保存对象的主键而不是引用的主键。如果您不定义引用的类,子类将不会作为单独的数据库记录保存,并且无法通过自己的仓库进行搜索。在这个例子中,字段'homeaddress'引用了类'Address'的实体

$refclasses = array(
    'User' => array('homeaddress' => 'Address')
);
$em->setReferenceClasses($refclasses);

使用CKDB数据库

默认函数

使用以下方式持久化对象

$u = new User();
$u->setId('4711'); 
$u->setFirstname('George');
$u->setEmail('george@mail.com');  
                 
$em->persist($u);

引用的对象将自动持久化。更改您的对象后,您必须持久化它。

使用以下方式删除对象

$em->remove($u);

对象通过类的类型和定义的主键进行标识!不要更改主键!

重新索引数据库

要按实体类重建整个索引,请使用reIndex()-函数;

$em->reIndex('User');                                                  

该方法应该在索引属性或对象删除发生许多更改后调用。不要在关键过程中调用它。

搜索

要搜索一个或多个已存储的对象,您应该使用一个仓库

$userRepository = $em->getRepository('User')                                                

CKDB在调用仓库的find()方法后提供了以下方法来查找实体

  • equals(匹配字段 = > 值的数组)
  • notEquals(匹配字段 = > 值的数组)
  • lt lte(小于 - 匹配字段 = > 值的数组)
  • gt gte(大于 - 匹配字段 = > 值的数组)
  • in(数组键必须包含字段值)
  • notIn(数组键必须不包含字段值)

此外,您还可以使用仓库的sortBy()-方法对结果进行排序。

示例选择

$userRepository->find()->equals(array('firstname' => 'George'))->gt(array('age' => '50'))->sortBy('age', SORT_DESC)->getResult();                                             

此选择在“firstname”字段中搜索名为“George”且年龄超过50岁(大于等于=gt)的记录。用户应按降序排序。getResult()-方法返回数据库中找到的对象数组。

使用in()在值列表中进行搜索,选择所有Martins和Georges。

$userRepository->find()->in('firstname', array('Martin','George'))->getResult();                                             

使用in()在对象列表中进行搜索,匹配其他数组列表中的条目(例如,所有名为Mo Miller的父亲的孩子)。

$fathers = $userRepository->find()->equals(array('firstname' => 'Mo', 'lastname' => 'Miller'))->getResult();    
$userRepository->find()->in('father', $fathers)->getResult();                                             

排序

sortBy()-方法在返回结果之前对结果进行排序。第一个参数定义了排序字段,第二个参数定义了排序顺序。您可以进行以下排序:

  • SORT_ASC 升序
  • SORT_DESC 降序

示例

$userRepository->find()->gt(array('age' => '50'))->sortBy('age', SORT_DESC)->getResult();  

选择所有年龄超过50岁的用户,并按年龄降序排序。

待办事项

  • 文档
  • 添加异常
  • 添加like()搜索方法
  • 添加引用实体的连接

贡献者

版权和许可

版权 2014 Christian Klisch,在Apache许可下发布。