Laravel 存取数组类型到 PgSql 带来的思考

简介: 今天需要一个问题,推荐算法同学在PgSql数据库创建了一个 integer[] 类型的字段,需要我们业务同学写入数据。

需求描述


今天需要一个问题,推荐算法同学在PgSql数据库创建了一个 integer[] 类型的字段,需要我们业务同学写入数据。

调研了好久发现 Laravel 没有提供底层支持,需要自己实现。


遇到的坑


  1. 我使用的 NaviCat 作为数据库的可视化管理工具,发现在我的可视化工具上根本没有 integer[] 这个类型,显示的是 varchar 类型,这里困扰了我半天。
  2. PHP 获得 pgsql 中数组类型的数据得到是这种类型 {1,2,3} ,就是字符串!所以我的NaviCat 显示 varchar 类型也是合理的。


实现需求


可以只看核心代码部分,代码段中写明了注释。


简单来说就是 {} 和 [] 的互相转化,基于字符串拼接的方式实现。


因为不管是pgsql中存储的还是我通过PHP读取到的类型都是字符串,并不是数组类型,这是个核心问题。


public static function updateJoinHouseGroupId($userid, $houseGroupId)
    {
        $model = self::query()
            ->selectRaw('"joinHouseGroupId"')
            ->where('userid', $userid)
            ->first();
        if ($model) {
            $model->houseGroupId = $houseGroupId;
            $joinHouseGroupId = $model->joinHouseGroupId;
            //核心代码begin---------------------------
            if ($joinHouseGroupId) {
                //已经有的要重新拼接
                $joinHouseGroupIdStr = substr($joinHouseGroupId, 1, strlen($joinHouseGroupId) - 2);
                //查询专场是否在有效期内
                $joinHouseGroupIds = explode(',', $joinHouseGroupIdStr);
                $joinNotExpireHouseGroupIds = HouseGroupInfo::getNotExpireIds($joinHouseGroupIds);
                if ($joinNotExpireHouseGroupIds) {
                    $joinHouseGroupId = "{" . implode(',', $joinNotExpireHouseGroupIds) . "," . $houseGroupId . "}";
                } else {
                    $joinHouseGroupId = "{" . $houseGroupId . "}";
                }
            } else {
                $joinHouseGroupId = "{" . $houseGroupId . "}";
            }
            //核心代码end----------------------------------
            self::query()
                ->where('userid', $userid)
                ->update([
                    'joinHouseGroupId' => $joinHouseGroupId,
                ]);
        }
    }


进一步思考


上述代码勉强实现了需求,但是不够优雅,我期望的形式是,自定义一个类型,比如 pgArray

当我在model中做如下设置时,能自动实现 gpsql中存取的数组转成PHP可以直接处理的数组。


protected $casts = [
        'xxxx' => 'pgArray',
    ];


以最简单的int型数组举例,PHP能处理的数组是这样的:[1,2,3]

而PgSql中存储的数组是这样的:{1,2,3}

要实现在存取时自动转换

相关文章
原生php实现自定义表单(支持基本类型+file类型(单文件上传))
原生php实现自定义表单(支持基本类型+file类型(单文件上传))
|
存储 编解码 编译器
GNU C 扩展语法:零初始化数组
零长度数组、变长度数组都是 GNU C 编译器支持的数组类型。今天我们来回顾一下零长度数组。
112 0
|
存储 PHP
PHP中的复合类型数据是什么意思?底层原理是什么?
PHP中的复合类型数据是什么意思?底层原理是什么?
119 0
|
程序员 PHP
PHP的可变变量是干什么的?使用场景是什么?底层原理是什么?
PHP的可变变量是干什么的?使用场景是什么?底层原理是什么?
|
存储 PHP
PHP中的对象为什么需要转为数组?底层原理是什么?
PHP中的对象为什么需要转为数组?底层原理是什么?
129 0
|
存储 PHP 索引
PHP中的数组有哪些特性?底层原理是什么?
PHP中的数组有哪些特性?底层原理是什么?
|
存储 PHP
PHP的常量特性有哪些?底层原理是什么?
PHP的常量特性有哪些?底层原理是什么?
|
PHP 开发者
PHP中的伪类型是干什么的?底层原理是什么?
PHP中的伪类型是干什么的?底层原理是什么?
PHP变量赋值的底层原理是什么?
PHP变量赋值的底层原理是什么?
|
存储 PHP
PHP 中的标量类型数据是什么意思?底层原理是什么?
PHP 中的标量类型数据是什么意思?底层原理是什么?
141 0