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

Laravel数据表格获取数组列输出时移除CONINET_ID字段引号的方法

Laravel 移除数据表格CONINET_ID列双引号包裹实现方案

问题现状

当前数据表格CONINET_ID列输出内容被[""]符号包裹,无法正常展示纯ID值,相关现有代码与效果如下:

  • 表格实际展示效果:
    数据表格效果图
  • 对应Blade模板代码:
@table([
    'id' => 'Persons.index',
    'xhr' => route('api.manage-dup-api'),
    'ns' => 'PersonsIndex',
    'columns' => $columns ?? [],
    'filters' => $filterTable ?? [],
    'params' => [
        'filters_live' => false,
        'selectable' => true,
        'toolbar_style' => 'fixed'
    ]
])
  • 接口查询逻辑代码:
$q->with('user')
    ->with('user.roles')
    ->select(
        'persons.*',
        'birth->date as birthdate'
    )->whereIn('id', $id)->orWhereIn('old_id_CONINET', $coninet_ids);
return $this->outputList($q, $request);

问题原因

该问题本质是old_id_CONINET字段在数据库中为JSON类型,Eloquent默认会将JSON类型字段解析为数组结构,接口输出JSON序列化时,单值数组就会被格式化为["实际ID值"]的样式,导致前端展示带多余符号。

可行方案

以下三种方案任选其一即可,优先推荐第一种,改动最小性能最优:

  • 方案1:查询阶段直接取出JSON字段原始字符串
    修改查询的select逻辑,通过数据库原生函数直接解析JSON字段为纯字符串返回,从源头避免数组序列化问题:

    $q->with('user')
        ->with('user.roles')
        ->select(
            'persons.*',
            'birth->date as birthdate',
            // MySQL数据库用下面这行
            \DB::raw('JSON_UNQUOTE(old_id_CONINET) as CONINET_ID')
            // 如果是PostgreSQL数据库,替换为下面这行
            // \DB::raw('old_id_CONINET->>0 as CONINET_ID')
        )->whereIn('id', $id)->orWhereIn('old_id_CONINET', $coninet_ids);
    return $this->outputList($q, $request);
    
  • 方案2:模型层配置字段转换
    在Person模型中通过$casts属性或访问器,自动处理字段输出格式:
    方式一:直接将字段转换为字符串类型

    // app/Models/Person.php 内添加
    protected $casts = [
        // 其余原有字段转换配置保留
        'old_id_CONINET' => 'string',
    ];
    

    方式二:如果字段可能存多值,用访问器拼接为字符串

    // app/Models/Person.php 内添加
    public function getOldIdCONINETAttribute($value)
    {
        $decoded = json_decode($value, true);
        return is_array($decoded) ? implode(',', $decoded) : $value;
    }
    
  • 方案3:前端表格列渲染时格式化
    不想修改后端逻辑的话,可以在定义$columns表格列配置时,给CONINET_ID列添加自定义渲染逻辑,输出时过滤掉多余符号:

    $columns = [
        // 其余列配置保留
        [
            'field' => 'CONINET_ID',
            'title' => 'CONINET_ID',
            'render' => function($row) {
                return is_array($row->CONINET_ID) 
                    ? $row->CONINET_ID[0] 
                    : trim($row->CONINET_ID, '[]"');
            }
        ]
    ];
    

内容的提问来源于stack exchange,提问作者Umar Farooq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:12:30