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}

要实现在存取时自动转换

相关文章
Beyond Compare 4密钥过期解决办法,超实用
Beyond Compare 4密钥过期解决办法,超实用
29135 1
|
9月前
|
人工智能 Kubernetes API
Dify+DeepSeek实战教程!企业级 AI 文档库本地化部署,数据安全与智能检索我都要
接下来这篇文章,就打算用最接地气的方式,手把手带你从 0 到 1 搭建一套专属的本地知识库系统。无论你是想优化企业内部文档检索(不用担心敏感数据上传云端的风险),还是像我一样想为用户打造更智能的文档服务,都能跟着步骤一步步实现。咱们不卖关子,直接上干货
1915 14
Dify+DeepSeek实战教程!企业级 AI 文档库本地化部署,数据安全与智能检索我都要
|
JavaScript 前端开发 API
探讨JavaScript动态添加HTML文件的技术
探讨JavaScript动态添加HTML文件的技术
609 1
|
弹性计算 关系型数据库 数据库
开源PostgreSQL在倚天ECS上的最佳优化实践
本文基于倚天ECS硬件平台,以自顶向下的方式从上层应用、到基础软件,再到底层芯片硬件,通过应用与芯片的硬件特性的亲和性分析,实现PostgreSQL与倚天芯片软硬协同的深度优化,充分使能倚天硬件性能,帮助开源PostgreSQL应用实现性能提升。
|
存储 JSON 前端开发
JSON 语法详解:轻松掌握数据结构(上)
JSON 语法详解:轻松掌握数据结构(上)
JSON 语法详解:轻松掌握数据结构(上)
|
开发框架 前端开发 JavaScript
Laravel
【7月更文挑战第21天】
150 4
|
关系型数据库 测试技术 OLTP
PosgreSQL快速参数调优和sysbench压测
关于PostgreSQL的性能调优可以参考《PostgreSQL 9.0 High Performance》,以及朱贤文在2014 PostgreSQL中国用户大会上分享的《高性能Postgres 最佳实践》。
1920 0
|
PHP 计算机视觉
php结合imagick 修改图片的DPI,达到与ps类似的效果
php结合imagick 修改图片的DPI,达到与ps类似的效果
530 1
|
存储 PHP 对象存储
Laravel 使用阿里云 oss 存储对象
1、 composer require jacobcyl/ali-oss-storage:dev-master 2、在config/app.php的providers下添加 Jacobcyl\AliOSS\AliOssServiceProvider::class, 3、在app/filesystems.
5873 0
|
BI C#
Grid++Report报表工具C/S实战篇(五)
一、课程介绍 本次分享课程属于《C#高级编程实战技能开发宝典课程系列》中的第五部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集、整理和完善此系列课程! 本次分享课程适合人群如下: 1、想学习Grid++Report报表工具在C/S项目中的实战演练。
2293 0