mattvb91 / lightmodel
轻量级数据库模型
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ^6.2
- satooshi/php-coveralls: ^1.0
This package is auto-updated.
Last update: 2024-09-16 06:13:40 UTC
README
LightModel
什么是LightModel?
LightModel ORM 是一个测试项目,旨在从头开始构建 ActiveRecord 风格的实现。
不建议在实时项目中使用此工具。请考虑使用 Eloquent 或 Zend Model,它们是健壮且经过高度测试的解决方案。
用法
要初始化 LightModel,您需要调用 LightModel::init();
并传递您的 PDO 实例。
$pdo = new PDO(/* Your PDO params*/); LightModel::init($pdo);
您还可以传递一个可选的数组进行进一步配置。例如
$options = [ LightModel::LightModel::OPTIONS_TYPECAST, ]; LightModel::init($pdo, $options);
目前,类型转换选项是唯一可用的选项。如果使用,这将把您的 MySQL 数据库中定义的整数列转换为模型上的整数属性。
要开始使用模型,您的类需要扩展 mattvb91\LightModel\LightModel
创建模型
namespace Project; use mattvb91\LightModel\LightModel; class User extends LightModel { // }
您需要在 getValues()
函数中实现,在该函数中定义与您的列相关联的键值数组。
例如,以下是一个具有以下结构的简单 User
表的表示:
| id (int) | username (varchar) |
namespace Project; use mattvb91\LightModel\LightModel; class User extends LightModel { public $username; public function getValues() { return [ 'username' => $this->username, ]; } }
如果您的 DB 中将主键列设置为自动递增值,则无需手动绑定主键列。
您当然可以在 getValues()
方法内部使用您正常的获取器来访问您的列值,只要您将其绑定到正确的列即可。
要在您的用户表中创建新行,请使用以下方法
$user = new User(); $user->username = 'Name'; $user->save();
要覆盖表名或表键,只需在您的类中实现以下操作
protected $tableName = 'new_name'; protected $key = 'new_key';
通过键获取行
要按其键获取行,请使用您想要获取的类的静态 Class::getOneByKey($key)
。例如
$user = User::getOneByKey(1); //$user now loaded with values from DB
检查模型是否存在
要检查模型是否实际上存在于您的数据库中,您可以使用 exists()
方法。
$user->exists(); //Returns true or false
刷新模型
您可能需要再次获取行的最新版本。使用 refresh()
方法更新您的当前模型。
请注意,这将使您的模型回到当前数据库中的内容。
$user->refresh();
删除模型
要删除模型,只需调用 delete()
方法
$user->delete();
关系
BelongsTo
要定义 Belongs to 关系,请在您的模型中使用 belongsTo($class, $foreignKey)
方法。例如,如果我们的用户与部门相关联,您可以在 User 类内部执行以下操作。
一旦查询过一次关系,任何进一步的访问将不再击中数据库。
public function department() { return $this->belongsTo(Department::class, 'department_id'); //returns a loaded Department::class instance }
获取多行
要获取多行,请使用 static::getItems()
方法。
$users = User::getItems();
过滤
您还可以通过在 static::getItems()
方法中传递一个可选的数组来过滤数据集。您必须传递正确的表列名。
$filter = [ 'username' => 'joe' ]; $allJoeUsers = User::getItems($filter);
您还可以传递您想要执行的运算符。顺序必须是 Table_Column => ['Operator', 'Value']
$filter = [ 'username' => ['>=', 'joe'] ]; $allJoeUsers = User::getItems($filter);
要设置顺序或限制返回的结果,您可以使用 LightModel::FILTER_ORDER
和 LightModel::FILTER_LIMIT
常量并将它们传递到您的选项数组中
$filter = [ LightModel::FILTER_ORDER => 'id DESC', LightModel::FILTER_LIMIT => 100; ]; $filteredUsers = User::getItems($filter);
获取键
有时,执行 static::getItems()
可能会返回过大的结果集。您可以使用 static::getKeys()
执行相同的过滤器,它现在将只返回符合过滤条件的唯一列 ID,而不是返回完整加载的模型数组。然后您可以使用该 ID 手动逐个加载完整的模型。
$filter = [ LightModel::FILTER_ORDER => 'id DESC', ]; $userKeys = User::getKeys($filter); //We now have an array consisting of all the primary keys that //match our criteria foreach($userKeys as $primaryKey) { //Load the full individual record for further processing $user = User::getOneByKey($primaryKey); }