yurykabanov/laravel-postgres-ext

此包已被弃用且不再维护。未建议替代包。

Laravel 5.x 扩展 PostgreSQL 驱动程序

v0.3.1 2016-07-24 14:55 UTC

This package is not auto-updated.

Last update: 2020-01-22 03:13:31 UTC


README

Build Status

该项目受 PostgreSQL 支持且 Laravel 不支持的功能启发。不幸的是,这些功能在官方仓库(如 此一个)中不被接受,并且开发者被告知要使用原始查询,这在我的看法中是完全错误的做法。

要求

  1. PHP >= 5.6 或 HHVM
  2. PostgreSQL。显然,它必须支持您想要使用的特定功能。例如,要使用 视图,它至少必须是 9.1 版本,要使用 upsert,它至少必须是 9.5 版本(当前稳定版)。

安装

  1. 运行 composer require yurykabanov/laravel-postgres-ext 来安装此包。
  2. 将数据库服务提供程序从原始 Illuminate\Database\DatabaseServiceProvider::class 更改为 YuryKabanov\Database\DatabaseServiceProvider::class
  3. 模型应扩展 YuryKabanov\Database\Eloquent\Model 而不是 Illuminate\Database\Eloquent\Model

可用功能

UPSERT

UPSERT(INSERT ON CONFLICT UPDATE)自 PostgreSQL 9.5 版本以来支持,可以通过调用执行

Model::upsert($arrayOfAttibutes, $uniqueField)

与原始 insert 方法一样,upsert 可以管理多条记录。

各种索引类型

PostgreSQL 支持多种索引类型:btreehashgistspgistginbrin(对于 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');