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,                 ]);         }     }<