mathsgod/r-db

轻量级 MySQL ORM 库

5.9.0 2024-09-24 08:17 UTC

README

PHP Composer

r-db

安装

composer require mathsgod/r-db

设置

使用 .env

使用 .env 文件设置默认数据库连接

DATABASE_HOSTNAME=
DATABASE_DATABASE=
DATABASE_USERNAME=
DATABASE_PASSWORD=
DATABASE_PORT=
DATABASE_CHARSET=

函数 Q

函数 Q 是从数据库中快速选择数据的一种方式。

简单选择

这将选择 User 表中的所有数据,并以 stdClass 数组的形式输出。

use function R\DB\Q;
print_r(Q("User")->get()); // select * from User

带有类关联的输出

您也可以以类关联的形式输出。

class User{

}
print_r(Q(User::class)->get()); // select * from User

带有字段和过滤器的选择

过滤参数基于 laminas-db where

print_r(Q("User")->fields(["user_id","username"])->filter(["type"=>1])->get()); 
// select user_id,username from User where type=1

带有 limit 和 offset 的选择

print_r(Q("User")->limit(10)->offset(0)->get()); // select * from User limit 10 offset 0

带有排序的选择

print_r(Q("User")->order("user_id desc")->get()); // select * from User order by user_id desc

填充

填充用于从其他表中选择相关数据,它将自动检查表之间的主键关系

class UserRole{

}

class User{

}

print_r(Q(User::class)->populate([
    UserRole::class=>[]
])->get());

/* 
Array
(
    [0] => User Object
        (
            [username] => admin
            [user_id] => 1
            [UserRole] => Array
                (
                    [0] => UserRole Object
                        (
                            [user_role_id] => 1
                            [user_id] => 1
                            [role] => Administrators
                        )

                )

        )

)
*/

Stream 包装器

通过使用 stream wrapper,您可以将数据库表作为文件访问

use R\DB\Schema;
use R\DB\Stream;

Stream::Register(Schema::Create(), "db");
echo file_get_contents("db://User"); //List all users, User is the table name
// User can also be a class name, it will auto convert to table name

列出单个记录

echo file_get_contents("db://User/1"); //List user with primary key 1

按字段列出

//List all user with fields first_name and last_name
echo file_get_contents("db://User?fields[]=first_name&fields[]=last_name"); 

//List user with primary key 1 and field username
echo file_get_contents("db://User/1?fields[]=user_id&fields[]=username"); 

按过滤器列出

$query=http_build_query([
    "filters"=>[
        "status"=>[
            "eq"=>1
        ]
    ]
]);

echo file_get_contents("db://User?$query"); //List all user with status=1

按 limit 和 offset 列出

echo file_get_contents("db://User?limit=10&offset=0"); //List first 10 users

检查表是否存在

file_exists("db://User"); //return true if table User exists

重命名表

rename("db://User","db://User2"); //rename table User to User2

删除表

unlink("db://User2"); //drop table User2

Schema Aware

您可以在类中定义一个名为 GetSchema() 的静态方法来定义表的架构

class User implements SchemaAwareInterface{
    public static function GetSchema(){
        return $schema1;
    }
}

类 R\DB\Model

通过扩展 R\DB\Model,您可以使用以下方法操作数据库

class User extends R\DB\Model{
} 

插入记录

User::Create([
    "username"=>"user1",
    "first_name"=>"John"
])->save();

获取记录

$user = User::Get(1);  // 1 is primary key

$user_not_exists = User::Get(999); // $user_not_exists==null

更新记录

$user = User::Get(1); // 1 is primary key
$user->first_name="Mary";
$user->save(); // user record updated

删除记录

$user = User::Get(1);  // 1 is primary key
$user->delete(); // user record is deleted

查询记录列表

$users = User::Query(["status"=>0]);
print_r($users->toArray());  // list all users status is equal to 0

默认驱动器选项

[
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false
]

mysql8 校对

由于 PHP PDO 默认校对不匹配 mysql8,请添加以下选项

$options=[
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'"
];