fist/database

此软件包已被废弃,不再维护。没有建议的替代软件包。

Fistlab PHP 数据库组件

dev-master / 1.0.x-dev 2017-02-13 12:51 UTC

This package is not auto-updated.

Last update: 2020-12-10 13:16:33 UTC


README

StyleCI Build Status Total Downloads Latest Stable Version Latest Unstable Version License

Fistlab 数据库组件是一个数据库工具包,提供了一种表达式的查询构建器。目前支持 MySQL 和 SQLite。

语言: php

安装

使用 Composer 进行安装。

composer require fist/database

准备

构造函数接受来自 RepositoryInterfacefist/repository 实例。

示例

$db = new \Fist\Database\Database(
    $repository = new Fist\Repository\ArrayRepository([
        'default' => [
            'connection' => 'default',
            'driver' => 'mysql',
        ],
        'connections' => [
            'default' => [
                'driver' => 'mysql',
                'hostname' => '127.0.0.1',
                'database' => 'database',
                'username' => 'root',
                'password' => '',
            ],
        ],
        'drivers' => [
            'mysql' => \Fist\Database\Connectors\MysqlConnection::class,
        ],
    ])
);

我在这个 gist 中进行了更多的设置。

使用方法

运行原始语句

可以通过使用 statement 方法来运行原始语句。

$db->statement("SELECT * FROM `users` WHERE `username` = 'mark'");

它还接受一个可选的第二个参数,用于绑定参数。让我们用绑定而不是查询来执行相同的查询。

$db->statement("SELECT * FROM `users` WHERE `username` = ?", ['mark'])

选择所有行

使用查询构建器从表中选择所有行非常简单。

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

foreach ($users as $user) {
    echo "Hello ".$user->username;
}

选择单行

通常你可能只想获取单个数据库行对象,比如当前登录的用户。

这也可以很容易地完成。

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

echo "Hello ".$user->username;

注意,如果没有结果,将返回 null。要获取异常而不是 null,请使用 firstOrFail 方法。

选择特定列

想要选择特定的列,比如 usernamenameage

$db->table('users')->select(['username', 'name', 'age'])->get();

你还可以为选择的列使用别名,比如你想获取 name 作为 fullname

$db->table('users')->select(['username', ['name' => 'fullname'], 'age'])->get();

Where 子句

你可以使用 where 子句来过滤查询结果。

基本的 where 子句

默认情况下,where 子句的运算符是 =

$db->table('users')->where('username', 'mark')->first();
$db->table('users')->where('username', '=', 'mark')->first();

上面两种方法会做完全相同的事情,但你也可以使用其他运算符。

$db->table('users')->where('username', '!=', 'mark')->first();
$db->table('users')->where('age', '>', 18)->first();
$db->table('users')->where('age', '<', 18)->first();
$db->table('users')->where('age', '>=', 18)->first();
$db->table('users')->where('age', '<=', 18)->first();
$db->table('users')->where('age', 'LIKE', 'ma%')->first();

where 子句的默认行为是使用 and 进行组合。

然而,你可能需要在某些情况下使用 or

$db->table('users')
    ->where('username', 'mark')
    ->orWhere('username', 'topper')
    ->first();

你可能想要将 where 子句分组在子子句中。

$db->table('users')
    ->where('username', 'mark')
    ->orWhere(function ($query) {
        $query->where('username', 'topper')
            ->orWhere('name', 'Mark Topper')
    })
    ->first();
Where null

想要使用 where 子句来过滤那些不是 null 的值。

$db->table('users')->whereNull('age')->get();
Where not null

想要使用 where 子句来过滤那些是 null 的值。

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

连接

您可以使用我们的连接方法加入额外的表。

内部连接表
$db->table('users')
    ->join('devices', 'users.id', '=', 'devices.user_id')
    ->get();

默认情况下,连接子句的运算符是 =
因此,您实际上可以使用 join('devices', 'users.id', 'devices.user_id')

外部连接表
$db->table('users')
    ->outerJoin('devices', 'users.id', '=', 'devices.user_id')
    ->get();
左连接表
$db->table('users')
    ->leftJoin('devices', 'users.id', '=', 'devices.user_id')
    ->get();
右连接表
$db->table('users')
    ->rightJoin('devices', 'users.id', '=', 'devices.user_id')
    ->get();
交叉连接表
$db->table('users')
    ->crossJoin('devices', 'users.id', '=', 'devices.user_id')
    ->get();
高级连接子句
$db->table('users')
    ->join('devices', function ($join) {
        $join->on('users.id', '=', 'devices.user_id')
            ->where('devices.platform', 'ios');
    })
    ->get();

排序结果

您可以通过列进行排序,而第二个参数控制排序方向,可以是 ascdesc

$db->table('users')
    ->orderBy('name', 'desc')
    ->get();

您可以通过多列进行排序。

$db->table('users')
    ->orderBy('fistname', 'desc')
    ->orderBy('lastname', 'desc')
    ->get();
随机排序

随机化顺序

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

分组结果

您可以分组结果。

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

限制结果(偏移量)

使用偏移量限制结果常用于分页。

$db->table('users')
    ->limit(100)
    ->offset(100)
    ->get();

计数结果

轻松计数行

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

原始表达式

有时您可能需要在查询中使用原始表达式。

$db->table('users')
    ->select([
        $db->raw('count(*) as user_count'),
        'status',
    ])
    ->groupBy('status')
    ->get();

条件子句

有时您可能只想在某个条件为真时运行查询的一部分。例如,您可以实现一个 where 语句,仅当用户登录时才应用。

$currentUserId = 1;
$loggedIn = true;

$db->table('users')
    ->when($loggedIn, function ($query) {
        $query->where('id', '=', $currentUserId);
    })
    ->get();

插入行

insert 方法接受一个包含列名和值的数组。

$db->table('users')->insert([
    ['email' => 'mark@example.com', 'username' => 'mark'],
    ['email' => 'john@example.com', 'username' => 'john'],
]);

或者您可以插入单行。

$db->table('users')->insert(
    ['email' => 'mark@example.com', 'username' => 'mark']
);
自动递增ID

想要插入行并获取自动递增的ID?您可以使用 insertGetId 方法。

$id = $db->table('users')->insertGetId(
    ['email' => 'mark@example.com', 'username' => 'mark']
);

更新行

更新将 username 设置为 mark 的用户的 name 吗?

$db->table('user')->where('username', 'mark')->update(['name' => 'Foobar']);

删除行

删除行从未如此简单。

$db->table('users')->where('last_login', '<', '2016-01-01 00:00:00')->delete();

如果您希望截断整个表,这将删除所有行并将自动递增ID重置为零,您可以使用 truncate 方法。

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

连接切换

如果您配置了多个连接,您可以在它们之间切换。除非指定其他连接,否则默认连接会被使用。

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