aejnsn/postgresify

此包已被放弃,不再维护。未建议替代包。

Laravel的扩展PostgreSQL功能

0.1.0 2016-10-24 21:20 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:21:03 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 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,然后它就变成了开发者的非标准偏好。有太多的不确定性,我真的很不喜欢。让我们看看存储货币的一些常见方法。

  1. 存储为float。不要这样做,这将导致准确性成为垃圾。
  2. 存储为decimal/numeric。这是可以的,并处理了需要存储分的情况。Decimal在分析操作中可能会影响性能。
  3. 使用分(或其他货币的基本单位)存储为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函数和运算符文档

日期范围

整数范围

数值范围

时间戳范围

带时区的时间戳范围

许可

参考文献