fetchall возвращает объект stdClass в laravel - PullRequest
0 голосов
/ 03 октября 2019

Я выполняю запрос к базе данных db2 ibm в Laravel.

call STOREDPROC.GET('leaders', '{"params": ""}', 'lead_management', 'FR');

Проблема в том, что fetchAll () возвращает массив объекта stdClass.

Array ( 
    [0] => stdClass Object ( 
        [noref] => 368 
        [nofab] => FORT 
        [actionname] => FORT BP720 
        [longactionname] => Epargne fort 
        [startat] => 1999-10-29 
        [endat] => 1999-10-29 
        [monthduration] => 0 
        [kam] => CTER 
        [cls] => SDO 
        [status] => O 
        [deletebyte] => 
    )
) 

Это хорошо и все, но вместо этого я бы предпочел получить массив. Я должен отправить данные через http-запрос, и, к сожалению, данные, полученные на другом конце запроса, возвращаются в виде потока.

Так как же заставить fetchAll возвращать массив вместо класса stdObject?

Я попытался отредактировать параметры в файле database.php в laravel следующим образом:

'options' => [
    PDO::ATTR_CASE => PDO::CASE_LOWER,
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
],

Но он все равно дает мне точно такой же результат.

Этомой код для извлечения данных в laravel:

private function execute($verb, $args): array
{
    $query = $this->buildQueryString($verb, $args);

    $this->buildConnection();

    $result = DB::connection('odbc')->select($query);

    return $result;
}

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Вы можете сделать это:

$result = json_encode($result);
$result = json_decode($result, true);
1 голос
/ 03 октября 2019

Я столкнулся с той же проблемой. К сожалению, этот параметр PDO находится глубоко в ядре платформы и не может быть изменен. Мне пришлось написать не очень хороший код, чтобы выйти из этой ситуации:

foreach ($result as $key => $item) {
    $result[$key] = (array) $item;
}
0 голосов
/ 04 октября 2019

Кажется, проблема заключалась в том, что кодирование специальных символов приводило к ошибкам синтаксиса и, следовательно, неверному форматированию json. Я заставил его работать, преобразовав кодировку utf8, а затем кодировав json_decode вместо *. 1001 *

public static function convert_from_latin1_to_utf8_recursively($result)
{
    if (is_string($result)) {
        return utf8_encode($result);
    } elseif (is_array($result)) {
        $ret = [];
        foreach ($result as $i => $d) $ret[ $i ] = self::convert_from_latin1_to_utf8_recursively($d);

        return $ret;
    } elseif (is_object($result)) {
        foreach ($result as $i => $d) $result->$i = self::convert_from_latin1_to_utf8_recursively($d);

        return $result;
    } else {
        return $result;
    }
}

И затем в моем ответе:

$response = json_decode($response, true);
return $response;
...