fist / database
Fistlab PHP 数据库组件
Requires
- php: >=5.6.4
- fist/repository: dev-master
Requires (Dev)
- fist/container: dev-master
- fist/testing: dev-master
- phpunit/phpunit: ~5.4
This package is not auto-updated.
Last update: 2020-12-10 13:16:33 UTC
README
Fistlab 数据库组件是一个数据库工具包,提供了一种表达式的查询构建器。目前支持 MySQL 和 SQLite。
语言: php。
安装
使用 Composer 进行安装。
composer require fist/database
准备
构造函数接受来自 RepositoryInterface
的 fist/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
方法。
选择特定列
想要选择特定的列,比如 username
、name
和 age
。
$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();
排序结果
您可以通过列进行排序,而第二个参数控制排序方向,可以是 asc
或 desc
。
$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();