tamedevelopers/database

轻量级PHP ORM数据库模型。

5.0.10 2024-08-07 01:31 UTC

README

Total Downloads Latest Stable Version License Code Coverage Gitter

灵感

在被介绍学习Laravel框架后;在过去的几年里,回归纯PHP确实有些困难。因此,我决定创建一种更简单的方式来与数据库通信,使用本地的PHP PDO:: Driver

文档

要求

  • >= php 8.0+

安装

在安装database包之前,获取PHP依赖关系管理器Composer,因为它将简化安装。

composer require tamedevelopers/database

实例化

步骤 1需要composer自动加载

require_once __DIR__ . '/vendor/autoload.php';

步骤 2 — 调用以下方法(),并在浏览器中运行一次

  • 这将自动设置您的整个应用,一触即发!
use Tamedevelopers\Database\AutoLoader;

AutoLoader::start();
  • 或 -- 辅助函数
autoloader_start();

Init.php文件

  • [可选] 这将扩展composer自动加载和其他设置

引导加载器

  • 如果您不想包括或使用init.php文件
    • 您只需要调用引导加载器,以启动您的应用程序。
use Tamedevelopers\Database\Capsule\AppManager;

AppManager::bootLoader();
  • 或 -- 辅助函数
app_manager()->bootLoader();

数据库连接

  • 您可以选择连接到多个数据库
    • 首先导航到[config/database.php]文件并添加配置
    • 需要两个参数key作为字符串数组[可选]
DB::connection('connName', [optional]);

数据库断开连接

  • 如果您想连接到已连接的数据库,您首先需要断开连接
    • 需要一个参数作为字符串
DB::disconnect('connName');

数据库重新连接

  • 数据库连接相同
DB::reconnect('connName', [optional]);

应用调试环境变量

  • .env文件中包含一个名为APP_DEBUG的键
    • 在生产环境中必须设置为false
    • 这有助于保护您的应用程序并退出错误404
    • 而不是显示整个服务器错误。

更多数据库连接键

  • 所有可用的连接键
    • DB_CONNECTION 只使用 mysql
    • 目前不支持其他连接类型。

用法

  • 所有使用方法

  • 接受一个参数作为 string table_name
$db->table('users');

插入

  • 接受一个作为关联数组的参数 column_name => value
    • 在成功或错误时返回一个对象
$db->table('users')->insert([
    'user_id'    => 10000001,
    'first_name' => 'Alfred',
    'last_name'  => 'Pete',
    'wallet_bal' => 0.00,
    'registered' => strtotime('now'),
]);

-- To see data, you need to save into a variable

插入或忽略

  • insert() 方法相同
    • 在错误时返回创建数据的对象或 false
$db->table('users')->insertOrIgnore([
    'user_id'    => 10000001,
    'first_name' => 'Alfred',
]);

更新

  • 接受一个作为关联数组的参数 column_name => value
    • 返回受影响的行数 int 或错误
$db->table('users')
    ->where('user_id', 10000001)
    ->update([
        'first_name' => 'Alfred C.',
    ]);

更新或忽略

  • update() 方法相同
    • 返回受影响的行数 int 或错误时的 0
$db->table('users')
    ->where('user_id', 10000001)
    ->updateOrIgnore([
        'first_name' => 'Alfred C.',
    ]);

删除

  • 返回一个 int
$db->table('users')
    ->where('user_id', 10000001)
    ->delete();

增加

  • 接受三个参数
    • 只有第一个参数是必需的

默认情况下,如果未传递第二个参数,则将递增 1

$db->table('users')
    ->where('user_id', 10000001)
    ->increment('wallet_bal');
$db->table('users')
    ->where('user_id', 10000001)
    ->increment('wallet_bal', 10);
  • 您还可以传递第二个或第三个参数以更新其他列
$db->table('users')
    ->where('user_id', 10000001)
    ->increment('wallet_bal', 100.23, [
        'first_name' => 'F. Peterson',
        'status'     => 1,
    ]);
  • 您可以选择不传递第二个参数,它将自动被视为更新参数(如果是一个数组)
$db->table('users')
    ->where('user_id', 10000001)
    ->increment('wallet_bal', [
        'first_name' => 'F. Peterson',
        'status'     => 1,
    ]);

减少

  • 与增量相同
$db->table('users')
    ->where('user_id', 10000001)
    ->decrement('wallet_bal', [
        'first_name' => 'F. Peterson',
        'status'     => 1,
    ]);

获取数据

GET

$db->table('users')->get();

第一个

$db->table('users')->first();

第一个或创建

  • 接受两个参数作为 array

    • 必须的 $conditions 参数作为 array
    • 可选的 $data 参数作为 array
  • 首先检查检索数据条件。如果失败,则将 $conditions$data 值合并以创建新记录

$db->table('users')->firstOrCreate(
    ['email' => 'example.com']
);
  • 或 - 示例 2
$db->table('users')->firstOrCreate(
    ['email' => 'example.com'],
    [
        'country'   => 'Nigeria',
        'age'       => 18,
        'dob'       => 2001,
    ]
);

第一个或失败

  • first() 方法相同,但如果找不到数据则退出错误代码 404
$db->table('users')->firstOrFail();

计数

$db->table('users')->count();

分页

  • 接受参数 int $per_page
    • 默认情况下,如果没有给出任何参数,则每页显示 10 个
$users = $db->table('users')
            ->paginate(40);


$users // this will return the data objects
$users->links() // this will return the paginations links view
$users->showing() // Display items of total results

存在

  • 返回布尔值 true \| false
$db->table('users')
    ->where('email', 'email@gmail.com')
    ->orWhere('name', 'Mandison')
    ->exists();

表存在

  • 接受参数 string $table_name
$db->tableExists('users');

集合

  • 您可以直接在任何以下内容上使用 Collections 实例methods
    • 所有以下 methods 都是由 Collection class 接收的
    1. get()
    2. find()
    3. first()
    4. firstOrIgnore()
    5. firstOrCreate()
    6. firstOrFail()
    7. insert()
    8. insertOrIgnore()

集合方法

集合用法

  • 在所有数据库检索请求上自动调用 Colections
    • 这样,您可以以 object\|array 键属性访问数据
    • 如果没有找到数据,则仅在 ->first() 方法上返回 null
$user = $db->tableExists('users')
            ->first();

if($user){
    $user->first_name
    $user['first_name']
}

$user->toArray()
$user->getAttributes()
  • 示例二(2) ->get() \| ->paginate() 请求
$users = $db->tableExists('users')
            ->where('is_active', 1),
            ->random(),
            ->get();

if($users->isNotEmpty()){
    foreach($users as $user){
        $user->first_name
        $user['first_name']
        $user->toArray()
        $user->getAttributes()
    }
}

分页

  • 配置分页

全局配置

  • 1 在 ENV 自动启动时设置全局分页 最受欢迎的方法
AutoLoader::configPagination([
    'allow' => true, 
    'prev'  => 'Prev Page', 
    'last'  => 'Last Page', 
    'next'  => 'Next Page', 
    'view'  => 'bootstrap',
    'class' => 'Custom-Class-Css-Selector', 
]);
  • 或 -- 辅助函数
config_pagination([
    'allow' => true,
]);

分页查询

$users = $db->table('users')->paginate(40);

分页数据

$users
// This will return `Collections` of pagination data

分页链接

$users->links();
// This will return pagination links view

分页链接配置

阅读更多...
  • 您可以直接配置分页链接
    • 注意:如果 configPagination() allow 设置为 true
    • 它将覆盖所有其他设置
$users->links([
    'first' => 'First Page',
    'last'  => 'Last Page',
    'prev'  => 'Previous Page',
    'next'  => 'Next Page',
])

分页显示

$users->showing();

// This will create a span html element with text
<span class='page-span'>
    Showing 0-40 of 500 results
</span>

分页显示配置

阅读更多...
  • 您还可以直接配置显示文本
$users->showing([
    'showing'  => 'Showing',
    'of'       => 'out of',
    'results'  => 'Results',
    'span'     => 'css-selector',
])

分页显示数字

  • 页码从 1 开始计数
    • 这将格式化所有分页项集合
    • 在每一页上,它从上一个分页项编号开始计数
$users = $db->table('users')->paginate(20);

foreach($users as $user){
    echo $user->numbers();
}

获取分页

  • 返回分页信息
$users = $db->table('users')->paginate(20);

$users->getPagination();

子句

  • 多个子句

查询

  • 允许使用直接 SQL 查询语法
    • 或直接查询 exec()
$db->query("SHOW COLUMNS FROM users")
    ->limit(10)
    ->get();


$db->query("ALTER TABLE `langs` ADD COLUMN es TEXT; UPDATE `langs` SET es = en;")
    ->exec();

Select

  • 用于从数据库中选择所需的列
$db->table('users')
    ->where('user_id', 10000001)
    ->select(['first_name', 'email'])
    ->select('email, 'name')
    ->first();

排序

  • 接受两个参数 $column$direction
    • 默认情况下,$direction 参数设置为 ASC
$db->table('wallet')
    ->orderBy('date', 'DESC')
    ->get();

排序原生的

  • 接受一个参数 $query
$db->table('wallet')
    ->orderByRaw('CAST(`amount` AS UNSIGNED) DESC')
    ->get();

最新

  • 默认情况下,接受一个参数 $column,使用的列是 id
$db->table('wallet')
    ->latest('date')
    ->get();

最旧

  • 默认情况下,接受一个参数 $column,使用的列是 id
$db->table('wallet')
    ->oldest()
    ->get();

随机排序

$db->table('wallet')
    ->inRandomOrder()
    ->get();

随机

阅读更多...
  • inRandomOrder() 相同
$db->table('wallet')
    ->random()
    ->get();

限制

  • 接受一个参数 $limit 作为 int。默认值是 1
$db->table('wallet')
    ->limit(10)
    ->get();

偏移

阅读更多...
  • 接受一个参数 $offset 作为 int。默认值是 0
$db->table('wallet')
    ->limit(3)
    ->offset(2)
    ->get();
  • 示例 2(仅提供偏移量将返回 LIMIT 而不出现错误)
$db->table('wallet')
    ->offset(2)
    ->get();

连接

  • 包括 join|leftJoin|rightJoin|crossJoin
$db->table('wallet')
    ->join('users', 'users.user_id', '=', 'wallet.user_id')
    ->get();
$db->table('wallet')
    ->join('users', 'users.user_id', '=', 'wallet.user_id')
    ->where('wallet.email', 'example.com')
    ->orWhere('wallet.user_id', 10000001)
    ->paginate(10);

左连接

  • join 相同
$db->table('wallet')
    ->leftJoin('users', 'users.user_id', '=', 'wallet.user_id')
    ->where('wallet.email', 'example.com')
    ->get();

条件

  • 接受三个参数
    • 只有第一个参数是必需的
$db->table('wallet')
    ->where('user_id', 10000001)
    ->where('amount', '>', 10)
    ->where('balance', '>=', 100)
    ->get();

或条件

阅读更多...
  • 与 Where 子句相同
$db->table('wallet')
    ->where('user_id', 10000001)
    ->where('amount', '>', 10)
    ->orWhere('first_name', 'like', '%Peterson%')
    ->where('amount', '<=', 10)
    ->get();

条件原生的

  • 允许您使用直接 SQL 查询语法
$date = strtotime('next week');

$db->table("tb_wallet")
    ->whereRaw("NOW() > created_at")
    ->whereRaw("date >= ?", [$date])
    ->where(DB::raw("YEAR(created_at) = 2022"))
    ->where('email', 'email@gmail.com')
    ->limit(10)
    ->random()
    ->get();

条件列

  • 接受三个参数 column operator column2
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereColumn('amount', 'tax')
    ->whereColumn('amount', '<=', 'balance')
    ->get();

条件为空

  • 接受一个参数 column
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereNull('email_status')
    ->get();

条件不为空

阅读更多...
  • 接受一个参数 column
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereNotNull('email_status')
    ->get();

条件在范围内

  • 接受两个参数 column 作为字符串 param 作为数组
    • 不支持浮点值
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereBetween('amount', [0, 100])
    ->get();

条件不在范围内

阅读更多...
  • whereBetween() 方法相同
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereNotBetween('amount', [0, 100])
    ->get();

条件在多个值中

  • 接受两个参数 column 作为字符串 param 作为数组
    • 不支持浮点值
$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereIn('amount', [10, 20, 40, 100])
    ->get();

条件不在多个值中

阅读更多...

whereIn() 方法相同

$db->table('wallet')
    ->where('user_id', 10000001)
    ->whereNotIn('amount', [10, 20, 40, 100])
    ->get();

分组

  • 接受一个参数 $column
$db->table('wallet')
    ->where('user_id', 10000001)
    ->groupBy('amount')
    ->get();

数据库迁移

  • 类似于Laravel数据库迁移 仅为使数据库表创建更加容易
use Tamedevelopers\Database\Migrations\Migration;

创建表架构

  • 接受参数为 表名
    • 第二个参数 字符串 jobs|sessions(可选)- 如果传递,将创建一个虚拟的 jobs|sessions 表模式
Migration::create('users');
Migration::create('users_wallet');
Migration::create('tb_jobs', 'jobs');
Migration::create('tb_sessions', 'sessions'); 

Table `2023_04_19_1681860618_user` has been created successfully
Table `2023_04_19_1681860618_user_wallet` has been created successfully
Table `2023_04_19_1681860618_tb_jobs` has been created successfully
Table `2023_04_19_1681860618_tb_sessions` has been created successfully
  • 或 -- 辅助函数
migration()->create('users');

Sample Session Schema

默认字符串长度

  • 在某些情况下,您可能希望设置所有迁移表的默认字符串长度
use Tamedevelopers\Database\Migrations\Schema;

Schema::defaultStringLength(200);
  • 或 -- 辅助函数
schema()->defaultStringLength(2000);

更新列默认值

  • 在某些情况下,您可能希望更新默认列的值
    • 是的!借助Schema,这是非常可能的。需要三个(3)个参数
    • $tablename 作为字符串
    • $column_name 作为字符串
    • $values 作为混合数据 NULL NOT NULL\|None STRING current_timestamp()
use Tamedevelopers\Database\Migrations\Schema;

Schema::updateColumnDefaultValue('users_table', 'email_column', 'NOT NULL);
Schema::updateColumnDefaultValue('users_table', 'gender_column', []);

or

schema()->updateColumnDefaultValue('users_table', 'gender_column', []);

运行迁移

  • 这将执行并运行位于 [root/database/migrations] 的文件中的迁移
Migration::run();

or
migration()->run();

Migration runned successfully on `2023_04_19_1681860618_user` 
Migration runned successfully on `2023_04_19_1681860618_user_wallet` 

删除迁移

阅读更多...
  • 请注意,这将执行并删除位于迁移中的所有文件表
  • [可选参数] bool 用于强制删除表
Migration::drop();

or
migration()->drop(true);

删除表

阅读更多...
  • 接受一个参数 string $table_name
use Tamedevelopers\Database\Migrations\Schema;

Schema::dropTable('table_name');

or 
schema()->dropTable('table_name');

删除列

阅读更多...
  • 要删除列 需要两个参数
    • 这将删除可用的列
use Tamedevelopers\Database\Migrations\Schema;

Schema::dropColumn('table_name', 'column_name');

or 
schema()->dropColumn('table_name', 'column_name');

获取数据库配置

$db->getConfig()

获取数据库连接

$db->dbConnection()
  • 或 -- 辅助函数
db_connection();

获取数据库名称

$db->getDatabaseName()

获取数据库PDO

$db->getPDO()

获取数据库表前缀

$db->getTablePrefix()

数据库导入

  • 您可以使用此类以编程方式将 .sql 导入到数据库中
    • 请记住,系统已经具有对您项目的绝对路径
use Tamedevelopers\Database\DBImport;

$database = new DBImport();

// needs absolute path to database file
$status = $database->import('path_to/orm.sql');

- Status code
->status == 404 (Failed to read file or File does'nt exists
->status == 400 (Query to database error
->status == 200 (Success importing to database
  • 或 -- 辅助函数
import('path_to/orm.sql');

更新环境变量

  • 您可以使用此类以编程方式将 .sql 导入到数据库中
use Tamedevelopers\Support\Env;

Env::updateENV('DB_PASSWORD', 'newPassword');
Env::updateENV('APP_DEBUG', false);
Env::updateENV('DB_CHARSET', 'utf8', false);

Returns - Boolean
true|false
  • 或 -- 辅助函数
env_update('DB_CHARSET', 'utf8', false);

校对和字符集

  • 校对和字符集数据 列表

校对

  • utf8_bin
  • utf8_general_ci
  • utf8mb4_bin
  • utf8mb4_unicode_ci
  • utf8mb4_general_ci
  • latin1_bin
  • latin1_general_ci

字符集

  • utf8
  • utf8mb4
  • latin1

扩展模型类

阅读更多...
  • 您还可以直接从其他类扩展DB模型类
use Tamedevelopers\Database\Model;

class Post extends Model{
    
    // define your custom model table name
    protected $table = 'posts';

    -- You now have access to the DB public instances
    public function getPost(){
        return $this->select(['images', 'title', 'description'])->get();
    }
}

辅助函数

错误输出

错误状态

  • 在出错时返回 404 状态码
  • 在成功时返回 200 状态码

有用链接