mattvb91/lightmodel

轻量级数据库模型

0.3 2018-10-15 17:15 UTC

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_ORDERLightModel::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);
}