nttech / datalayer
数据层是数据库的持久抽象组件,PDO
Requires
- php: >=8.0
- ext-pdo: *
README
数据层是一个用于数据库持久抽象的组件,它使用PDO和预定义语句来执行如注册、读取、编辑和删除数据的常用操作。
特点
- 易于配置
- 连接多个数据库
- 完全抽象CRUD
- 创建安全模型
- 为composer准备好了
- 兼容PSR-2
安装
DataLayer可以通过Composer获取
"nttech/datalayer": "v1.0.0"
或者执行
composer require nttech/datalayer
文档
要获取有关如何使用DataLayer的更多详细信息,请参阅组件目录中的详细示例文件夹。
连接
为了开始使用DataLayer,我们需要与您的数据库建立一个连接。有关可能的连接信息,请访问PHP.net的PDO连接手册
连接单个数据库
define('DATA_LAYER_CONFIG', [ 'driver' => 'mysql', 'host' => 'localhost', 'port' => '3306', 'dbname' => 'datalayer_example', 'username' => 'root', 'passwd' => '', 'options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_NATURAL, ], ]);
连接两个或更多数据库
define('DATA_LAYER_CONFIG', [ 'db_1' => [ // Chave personalizada: faz referência ao datalayer_example_1 'driver' => 'mysql', 'host' => 'localhost', 'port' => '3306', 'dbname' => 'datalayer_example_1', 'username' => 'root', 'passwd' => '', 'options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_NATURAL, ], ], 0 => [ // Isto não é uma chave personalizada 'driver' => 'mysql', 'host' => 'localhost', 'port' => '3306', 'dbname' => 'datalayer_example_2', // Neste caso, a chave é o próprio nome do banco de dados 'username' => 'root', 'passwd' => '', 'options' => [ PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_NATURAL, ], ], // ... ]);
自定义键 (int|string)
当定义时,必须在模型类中使用它来连接到在 dbname 中定义的数据库。
模型类
DataLayer基于MVC结构,采用Layer Super Type和Active Record设计模式。因此,为了使用它,需要创建自己的表模型并继承DataLayer。
class User extends DataLayer { public function __construct() { parent::__construct(string $entity, ?array $required = [], string $primary = 'id', mixed $timestamps = false, ?string $database = null); } }
参数
entity (必需)
表名。
required (可选,默认: [])
定义为 NOT NULL 的列名。
primary (可选,默认: id)
主键。此参数不能为 null。
timestamps (可选,默认: false)
接受布尔型和字符串型。当存在 created_at 和/或 updated_at 列时使用。
布尔型
False,如果两个列都不存在。True,如果两个列都存在。
字符串型
如果只有一个列存在,指定其名称。
database (可选,默认: null)
数据库名称或自定义键(当定义时)该模型将连接到。
此参数仅在 DATA_LAYER_CONFIG 配置为连接到两个或更多数据库时指定。
find
数据库查询。
<?php use Example\Models\User; $model = new User(); // Encontre todos os usuários $users = $model->find()->fetch(true); // Encontre todos os usuários por grupo $users = $model->find()->group('last_name')->fetch(true); // Encontre todos os usuários e ordene por um campo $users = $model->find()->order('email DESC')->fetch(true); // Encontre todos os usuários com limite de 2 $users = $model->find()->limit(2)->fetch(true); // Encontre todos os usuários com limite 2 e deslocamento 2 $users = $model->find()->limit(2)->offset(2)->fetch(true); // Encontre um usuário por condição (apenas termos) $user = $model->find('first_name = "Giovanni"')->fetch(); // Encontre um usuário por condição (termos e parâmetros) $user = $model->find('last_name = :last_name', 'last_name=A. L. Oliveira')->fetch(); // Encontre um usuário por duas condições $user = $model->find('first_name = :first_name AND last_name = :last_name', 'first_name=Giovanni&last_name=A. L. Oliveira')->fetch();
findByPrimaryKey
根据模型类参数 $primary 中定义的主键进行查询。
<?php use Example\Models\User; $model = new User(); $user = $model->findByPrimaryKey('giovanni.al.oliveira@gmail.com'); echo $user->first_name;
findById
根据定义的 id 列进行查询。
<?php use Example\Models\User; $model = new User(); $user = $model->findById(2); echo $user->first_name;
安全参数
请参阅 find_example.php 文件和 User.php 类中的示例。
<?php use Example\Models\User; $params = http_build_query(['first_name' => 'Giovanni']); $model = new User(); $user = $model->find('first_name = :first_name', $params); var_dump($user, $user->fetch());
count
计算找到的记录总数。
<?php use Example\Models\User; $model = new User(); $count = $model->find()->count(); echo $count;
make save
在数据库中创建记录。
<?php use Example\Models\User; $user = new User(); $user->first_name = 'Giovanni'; $user->last_name = 'A. L. Oliveira'; $user->save(); // Ou $user->make()->save();
change save
在数据库中更新记录。
<?php use Example\Models\User; $user = (new User())->findById(2); $user->last_name = 'Alves de Lima Oliveira'; $user->change()->save();
functionSql
在创建或更新记录时,允许使用SQL函数处理数据。
<?php use Example\Models\User; $user = new User(); $user->first_name = 'Giovanni'; $user->last_name = 'A. L. Oliveira'; // $user->functionSql(string $column, string $function); $user->functionSql('name', 'CONCAT(:first_name, " ", :last_name)'); $user->save();
destroy
在数据库中删除记录。
<?php use Example\Models\User; $user = (new User())->findById(2); $user->destroy();
fail
在尝试在数据库中执行操作时返回错误。
<?php use Example\Models\User; $user = (new User())->findById(2); if($user->fail()){ echo $user->fail()->getMessage(); }
自定义数据方法
创建方法以在获取数据时进行特定处理。
class User{ //... public function fullName(): string { return "{$this->first_name} {$this->last_name}"; } public function document(): string { return 'Restrito'; } } echo $this->full_name; // Giovanni A. L. Oliveira echo $this->document; // Restrito
贡献
将错误报告、建议和拉取请求发送到GitHub问题跟踪器。
支持
如果您发现与安全相关的任何问题,请使用GitHub问题跟踪器。
感谢(õ.~)
许可证
MIT许可证。请参阅许可证文件获取更多信息。