Skip to content

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

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

需求描述

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

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

遇到的坑

  1. 我使用的 NaviCat 作为数据库的可视化管理工具,发现在我的可视化工具上根本没有 integer[] 这个类型,显示的是 varchar 类型,这里困扰了我半天。

  2. PHP 获得 pgsql 中数组类型的数据得到是这种类型 {1,2,3} ,就是字符串!所以我的NaviCat 显示 varchar 类型也是合理的。

实现需求

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

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

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

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可以直接处理的数组。

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

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

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

要实现在存取时自动转换

大家有什么好想法欢迎在评论区讨论

硬核文章推荐

PHP转Go 2021年年中总结

如何第一时间收到接口报错?不用测试妹子再质疑你是不是接口挂了。

Git使用实战:多人协同开发,紧急修复线上bug的Git操作指南。

性能优化反思:不要在for循环中操作DB

性能优化反思:不要在for循环中操作DB 进阶版

最后

👍🏻:觉得有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!

AI 应用开发训练营 · 现在开始

别只收藏 AI 文章,今天就做出第一个能上线的项目

文章解决认知,项目才证明能力。把 Agent、RAG、MCP 变成可运行、可展示、可面试表达的成果,现在就从一次岗位准备度自测开始。

立即开始 AI 岗位准备度自测 查看训练营路线
真实学员成果先看成果,再决定是否开始 →
  1. 01选方向
  2. 02做项目
  3. 03出成果
  4. 04拿面试