yurykabanov / laravel-postgres-ext
Laravel 5.x 扩展 PostgreSQL 驱动程序
Requires
- php: >=5.6
- laravel/framework: ^5.2
Requires (Dev)
- phpunit/phpunit: ^5.4
This package is not auto-updated.
Last update: 2020-01-22 03:13:31 UTC
README
该项目受 PostgreSQL 支持且 Laravel 不支持的功能启发。不幸的是,这些功能在官方仓库(如 此一个)中不被接受,并且开发者被告知要使用原始查询,这在我的看法中是完全错误的做法。
要求
- PHP >= 5.6 或 HHVM
- PostgreSQL。显然,它必须支持您想要使用的特定功能。例如,要使用 视图,它至少必须是 9.1 版本,要使用 upsert,它至少必须是 9.5 版本(当前稳定版)。
安装
- 运行
composer require yurykabanov/laravel-postgres-ext
来安装此包。 - 将数据库服务提供程序从原始
Illuminate\Database\DatabaseServiceProvider::class
更改为YuryKabanov\Database\DatabaseServiceProvider::class
。 - 模型应扩展
YuryKabanov\Database\Eloquent\Model
而不是Illuminate\Database\Eloquent\Model
。
可用功能
UPSERT
UPSERT(INSERT ON CONFLICT UPDATE)自 PostgreSQL 9.5 版本以来支持,可以通过调用执行
Model::upsert($arrayOfAttibutes, $uniqueField)
与原始 insert 方法一样,upsert 可以管理多条记录。
各种索引类型
PostgreSQL 支持多种索引类型:btree、hash、gist、spgist、gin 和 brin(对于 9.5 版本)以及其他索引相关功能(例如,索引可以并发创建,即无需锁定表)。此包支持创建所有当前支持的索引方法。
可以使用与原始方法相同的语法创建索引
$table->index('column_name');
但它现在接受额外的参数
$table->index('column_name', 'index_name', $methodName, $arrayOfOptions);
其中 $methodName
是前面列出的一种方法,而 $arrayOfOptions
是包含不同选项(如并发性和唯一性)的数组。
示例:
// CREATE INDEX CONCURRENTLY ... USING GIST ... $table->index('column_name', 'index_name', 'gist', [ 'concurrently' => true ]); // CREATE UNIQUE INDEX ... USING BTREE ... $table->index('column_name', 'index_name', 'gin', [ 'unique' => true ]);
注意,有两种使列唯一的方式:使用 约束 和 索引(更多信息)。Laravel 使用 约束 来使列唯一,此行为对于 $table->unique()
保持不变,但您还可以使用 $table->index($col, $index, $method, [ 'unique' => true ])
创建 唯一索引。
视图
PostgreSQL 支持 视图(自 9.1 版本起)和 物化视图(自 9.3 版本起)。可以使用 DB::statement()
创建它们,但使用一些别名来管理它们更为方便。
可以使用以下语句创建视图
// create non-materialized view using specified select statement Schema::createView('some_view', 'select 1 as some_value'); // create materialized view using specified select statement Schema::createView('some_view', 'select 1 as some_value', true);
并丢弃
// create non-materialized view using specified select statement Schema::dropView('some_view');
到目前为止,它不支持一些查询构建器,因为视图的 SELECT 语句可能(并且通常)非常复杂。
Jsonb 操作符
laravel声称它确实支持jsonb
类型和jsonb运算符,如?
、?|
和?&
。但由于在预处理语句中它们被视为参数,所以在查询中无法使用它们。此包会自动将这些运算符包装在适当的函数中(注意?|
也用于其他类型--目前不支持这种行为)。
按分组集、汇总、立方进行分组
官方文档中描述了可用的分组表达式。
// GROUP BY GROUPING SETS ((brand), (size), ()) DB::table('some_table')->groupByGroupingSets('brand', 'size', null); // GROUP BY ROLLUP (e1, e2, e3) DB::table('some_table')->groupByRollup('e1', 'e2', 'e3'); // GROUP BY CUBE (e1, e2, e3) DB::table('some_table')->groupByCube('e1', 'e2', 'e3');