在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
相关产品推荐
相关产品推荐

