konstmal / 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: 2024-09-20 20:41:42 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 万亿!不再需要
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的其他使用)中的use
语句使用此示例中的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
存储为一个整数(分),但清理了显示和返回的结果。Money
比decimal
有更好的性能。范围从-92233720368547758.08到+92233720368547758.07,所以可以处理大额。
货币
网络地址类型
网络地址处理起来可能很麻烦。想象一下,你需要查询具有特定子网掩码的所有IP地址的场景。PostgreSQL为此类目的提供了网络地址函数和运算符。
我为Laravel中的IP和MAC地址类型提交了一个pull request。因此,这两个类型将包含在您的初始Laravel安装(5.2.27+)中,并且应该适用于Laravel支持的所有的数据库系统。然而,与其它数据库系统不同,PostgreSQL内置了丰富的网络地址函数和运算符。
IP地址
MAC地址
子网掩码
范围类型
范围功能非常强大。范围包括下限和上限,其中任何一个都可以是包含或排除的。如果没有范围类型,这将需要四个列来构建该功能。请查看PostgreSQL的范围函数和运算符文档。
日期范围
整数范围
数值范围
时间戳范围
带时区的时间戳范围
许可
- 本软件包采用MIT许可证。