Laravel 存取数组类型到 PgSql 带来的思考
「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」
需求描述
今天需要一个问题,推荐算法同学在PgSql数据库创建了一个 integer[] 类型的字段,需要我们业务同学写入数据。
调研了好久发现 Laravel 没有提供底层支持,需要自己实现。
遇到的坑
我使用的
NaviCat作为数据库的可视化管理工具,发现在我的可视化工具上根本没有 integer[] 这个类型,显示的是varchar类型,这里困扰了我半天。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, ]); } }<