nttech/datalayer

数据层是数据库的持久抽象组件,PDO

v1.0.5 2023-09-08 01:20 UTC

This package is auto-updated.

Last update: 2024-09-08 04:26:27 UTC


README

Maintainer Source Code PHP from Packagist Latest Version Software License Build Quality Score Total Downloads

数据层是一个用于数据库持久抽象的组件,它使用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许可证。请参阅许可证文件获取更多信息。