You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Laravel Eloquent中如何解析读取PostgreSQL的hstore字段值

解决方案

Laravel 默认不会自动将 PostgreSQL 的 HSTORE 类型字段转换为 PHP 可操作的数组/对象,所以直接取值拿到的是 HSTORE 格式的原生字符串,以下是几种可落地的实现方案:

方案1:模型配置类型转换(推荐)

这是最长期规范的方案,直接在 Eloquent 模型中声明 HSTORE 字段的转换规则,Laravel 会自动完成 HSTORE 和 PHP 数组的双向转换:

namespace App;
use Illuminate\Database\Eloquent\Model;
class TableModel extends Model
{
   protected $table = 'table';
   // 新增类型转换配置
   protected $casts = [
       'values' => 'array'
   ];
}

配置完成后直接按数组方式取值即可:

$model = TableModel::find(1);
// 提取name对应的值
$name = $model->values['name'];
// 提取value对应的值
$value = $model->values['value'];

写入数据时也可以直接传入数组,Laravel 会自动转为 HSTORE 格式存入数据库。

方案2:临时解析已拿到的字符串

如果不想改动模型,也可以直接对拿到的 HSTORE 字符串做解析:

方式A:用PG扩展自带的解析函数(需PHP开启pgsql扩展)

$values = pg_parse_hstore($model->values);
$name = $values['name'];
$value = $values['value'];

方式B:正则解析(无扩展依赖)

preg_match_all('/"([^"]+)"=>"([^"]+)"/', $model->values, $matches);
$values = array_combine($matches[1], $matches[2]);
$name = $values['name'];
$value = $values['value'];

方案3:查询阶段直接提取字段值

直接利用 PostgreSQL 原生的 HSTORE 操作符,在查询时就把对应值取出来,不需要后续处理:

$model = TableModel::selectRaw("id, values->'name' as name, values->'value' as value")->find(1);
// 直接取值
$name = $model->name;
$value = $model->value;

注意:你示例代码里写的$model->value大概率是笔误,你的字段名是values,注意不要少写末尾的s。

内容的提问来源于stack exchange,提问作者Dimitrios Desyllas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:15:04