konstmal/postgresify

为Laravel扩展PostgreSQL功能

v1.0.2 2018-05-07 13:54 UTC

This package is not auto-updated.

Last update: 2024-09-20 20:41:42 UTC


README

Postgresify

注意

此软件包正在开发中。

目录

这是什么?

安装

几何类型

货币类型

网络地址类型

范围类型

许可

参考

这是什么?

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,然后归结为开发者的非标准偏好。这里有很多不确定性,我不喜欢这样。让我们来看看存储货币的一些常见方法。

  1. float存储。不要这样做,你会得到不准确的数据。
  2. decimal/numeric存储。这是可以接受的,可以处理需要存储一分钱几分之一的场景。在小数操作中,Decimal可能会影响你的性能。
  3. 使用分(或其他货币的基本单位)以integer存储,或使用money。这是最好的方法,在不需要一分钱几分之一的场景下使用。PostgreSQL的money存储为一个整数(分),但清理了显示和返回的结果。Moneydecimal有更好的性能。范围从-92233720368547758.08到+92233720368547758.07,所以可以处理大额。

货币

网络地址类型

网络地址处理起来可能很麻烦。想象一下,你需要查询具有特定子网掩码的所有IP地址的场景。PostgreSQL为此类目的提供了网络地址函数和运算符

我为Laravel中的IP和MAC地址类型提交了一个pull request。因此,这两个类型将包含在您的初始Laravel安装(5.2.27+)中,并且应该适用于Laravel支持的所有的数据库系统。然而,与其它数据库系统不同,PostgreSQL内置了丰富的网络地址函数和运算符。

IP地址

MAC地址

子网掩码

范围类型

范围功能非常强大。范围包括下限和上限,其中任何一个都可以是包含或排除的。如果没有范围类型,这将需要四个列来构建该功能。请查看PostgreSQL的范围函数和运算符文档

日期范围

整数范围

数值范围

时间戳范围

带时区的时间戳范围

许可

参考