aejnsn / postgresify
Laravel的扩展PostgreSQL功能
Requires
- php: >=5.5.9
- illuminate/database: ~5.1
- illuminate/support: ~5.1
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2020-01-24 16:21:03 UTC
README
注意
此包处于开发中。
目录
这是什么?
Postgresify是一个为Laravel和Lumen扩展对一些有用PostgreSQL数据类型支持的包。此包允许您在Laravel的Schema Builder中使用PostgreSQL的数据类型,如点、inet、圆等,并在Fluent/Eloquent中检索有意义的数据。
示例迁移
Schema::create('hotel_search', function (Blueprint $table) { // ... $table->point('geocode_coordinates'); $table->ipAddress('visitor_ip_address'); $table->circle('search_area'); $table->dateRange('reservation_period'); $table->money('budget'); // ... });
生活更容易,对吧?上面关于PostgreSQL类型的用例消除了几个立即明显的问题
- 点类型在一个字段中存储地理坐标--不是两个字段。
- IP地址类型将存储IPv4或IPv6--这里没有
VARCHAR
。 - 圆类型在一个字段中存储一个中心点和半径 <(x, y), r>。没有这个,还有其他更“狡猾”的方法来存储与中心点相关的半径。
- 日期范围类型只存储日期范围。这与点类型一样,消除了第二个字段的必要性。
- 货币类型存储带符号的、与区域设置敏感的货币金额,范围为+/- 92 quadrillion!不再需要
DECIMAL(11,2)
或人们现在通常做的事情。
现在让我们讨论这些附加类型提供的实际效用。PostgreSQL提供了与这些数据类型有意义工作的函数和运算符。这取决于您环境的架构,但结合这些类型和函数/运算符,您可以将一些工作卸载到数据库服务器上--这可能会更快,并减少应用程序代码中的某些责任。效果可能因情况而异。请参阅此StackExchange Q/A。
安装
要安装此包,您需要
- Laravel 5.1+或Lumen 5.1+
- PHP 5.5.9+
此包适用于PostgreSQL 9.4+。
将此包添加到您的composer.json
文件中作为依赖项:composer require aejnsn/postgresify dev-master
Laravel
通过Composer安装后,在您的config/app.php
配置文件中注册Postgresify的DatabaseServiceProvider
,如下所示
'providers' => [ // Other service providers... Aejnsn\Postgresify\DatabaseServiceProvider::class, ],
基本用法
如果您想在您的IDE中为Postgresify提供的PostgreSQL类型使用代码补全,请确保您的迁移(或其他使用Illuminate Schema Builder的情况)使用Aejnsn\Postgresify\Database\Schema\Blueprint
类,如下所示:
<?php use Aejnsn\Postgresify\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateHotelsTable extends Migration { public function up() { Schema::create('hotels', function (Blueprint $table) { $table->dateRange('reservation'); // Build your schema using PostgreSQL's awesome types... }); } // ... }
几何类型
PostgreSQL的几何类型可以在减少应用复杂性的同时为您提供强大的功能。
PostgreSQL的几何类型并不试图替代在执行地理计算时需要的PostGIS。请记住,这是几何类型,而不是地理类型——地球不是平的,甚至不是一个完美的球体,而是一个扁球体(椭圆体)。因此,请不要使用几何类型进行重型地理工作。如果您确定需要,请使用PostGIS,因为您的准确性取决于它。对于那些想要成为大地测量爱好者的人,请查看Charles F. F. Karney的工作。Karney的算法精度达到15纳米。
矩形框
圆
线
线段
路径
点
多边形
货币类型
在应用程序/数据库中存储货币的方法一直是争论的热点,并且关于这个话题有很多错误信息。人们开始引用GAAP,然后它就变成了开发者的非标准偏好。有太多的不确定性,我真的很不喜欢。让我们看看存储货币的一些常见方法。
- 存储为
float
。不要这样做,这将导致准确性成为垃圾。 - 存储为
decimal
/numeric
。这是可以的,并处理了需要存储分的情况。Decimal在分析操作中可能会影响性能。 - 使用分(或其他货币的基本单位)存储为
integer
或使用money
。这是最好的方法,并且适用于您不需要分的情况。PostgreSQL的money
以整数(分)的形式存储,但清理了显示和返回。与decimal
相比,Money
性能更好。money
的范围是-92233720368547758.08到+92233720368547758.07,所以是的,它可以处理大量金额。
货币
网络地址类型
网络地址的处理可能会很麻烦。想象一下您需要查询特定子网掩码下所有IP地址的用例。PostgreSQL有用于此类目的的网络地址函数和运算符。
我为Laravel中的IP和MAC地址类型提交了一个请求。因此,这两种类型将包含在您的初始Laravel安装(5.2.27+)中,并且应该在Laravel支持的所有数据库系统中工作。然而,与其它数据库系统不同,PostgreSQL内置了丰富的网络地址函数和运算符。
IP地址
MAC地址
子网掩码
范围类型
范围功能非常强大。范围包括下界和上界,其中任一可以是包含或排除。如果没有范围类型,将需要四个列来构建这种功能。请参阅PostgreSQL的Range函数和运算符文档。
日期范围
整数范围
数值范围
时间戳范围
带时区的时间戳范围
许可
- 本软件包采用MIT许可协议授权。