0

如何在 PHP 上强制输入 db:select(db::raw($query)) 类型?

我有一个非常复杂的查询,我从中获取数据,为此我使用DB::raw($query).

array_agg()在 2 列中使用 postgreSQL 函数。

SQL 示例:

$query =   'select
              a,
              array_agg(b) FILTER (where b is not null) as b,
              array_agg(c) FILTER (where c is not null) as c
            from table X 
            group_by a'

使用 PGAdmin 的 SQL 的结果是:

-----------------------
|A  |    B    |  C    |
|int|   int[] | int[] |
|---------------------|
|1  | {1,2,3} | null  |
|2  | {5,6,7} | null  |
|3  |  null   |  {8}  |
|4  |  null   |{9,10} |
-----------------------

那就是当我这样做的时候:

$value = DB::SELECT(DB::raw($query))

正如预期的那样$value,是一个对象数组。

也就是说属性 b 和 c 不是整数数组,而是字符串。

dd($value) 看起来像:

array:4[
0 =>{
 "a":1
 "b":"{1,2,3}"
 "c":null
}
1 =>{
 "a":2
 "b":"{4,5,6}"
 "c":null
}
2 =>{
 "a":3
 "b":null
 "c":"{8}"
}
3 =>{
 "a":4
 "b":null
 "c":'{9,10}'
}
]

有没有办法将“b”和“c”的值作为数组或 null?

数组 ($value) 中有很多元素可以循环通过它进行强制转换。

OBS:我正在使用 php7.4.9

4

1 回答 1

0

一种方法是transform在您的结果上使用该方法并根据您的需要转换结果

$values = $values->transform(function ($item) {

    if (! is_null($item->b)) {
        $item->b = array_map(
            'intval',
            explode(
                ',',
                str_replace(
                    ['{', '}'], '', $item->b
                )
            )
        );
    }

    if (! is_null($item->c)) {
        $item->c = array_map(
            'intval',
            explode(
                ',',
                str_replace(
                    ['{', '}'], '', $item->c
                )
            )
        );
    }

    return $item;

});

如果您正在寻找数据库级别的内容,请查看此线程和此答案

于 2021-02-13T04:57:50.537 回答