php - fputcsv Невозможно использовать объект типа stdClass в качестве массива - PullRequest
0 голосов
/ 22 октября 2018

Я использую метод post для загрузки csv с использованием php с fputcsv, когда я использую метод get, он работает, но при использовании post он выдает ошибку, не могу использовать stdClass в качестве массива, люди упоминают об использовании json_decode, но яне уверен, куда его поместить,

Я использую laravel

КОД:

public function csv (Request $request) {

    $storage_path = storage_path();

    $from = date($request->from_date);
    $to = date($request->to_date);

    $table = DB::table('registrations')->whereBetween('created_at', [$from, $to])->get();



    $filename = "data.csv";
    $handle = fopen('php://output', 'w+');

    fputcsv($handle, array('No', 'Nama', 'Nomor Telepon', 'Email', 'Tempat Tinggal',
        'Bank', 'Kartu Kredit', 'Rumah', 'Mobil', 'Luar Negeri', 'Penghasilan'));

    foreach($table as $row) {
            fputcsv($handle, array( $row['id'], $row['name'], $row['phonenumber'], $row['email'],
                            $row['umur'], $row['tempattinggal'],
                            $row['bank'], $row['kartukredit'], $row['rumah'],
                            $row['keluarnegeri'], $row['penghasilan'] ));
    }

    fclose($handle);

    $headers = array(
            'Content-Type' => 'text/csv',
    );

    return Response::download($filename, 'data.csv', $headers);
}

ошибка происходит на foreach, когда я удаляю для каждого, я могузагрузить CSV, но в плохом формате

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Я думаю, что проблема с вашим кодом в том, что при извлечении записей из базы данных они возвращаются как объект, и вы пытаетесь использовать этот объект, как если бы он был массивом.

У вас есть 2 решения, решение 1 является наиболее эффективным:

Решение 1: Используйте переменную $row в качестве объекта вместо массива

foreach($table as $row) {
    fputcsv($handle, array( $row->id, $row->name, $row->phonenumber, $row->email,$row->umur, $row->tempattinggal,$row->bank, $row->kartukredit, $row->rumah,$row->keluarnegeri, $row->penghasilan ));
}

Решение 2: Преобразование $row в массив для каждого цикла

foreach($table as $row) {
    $row = json_decode(json_encode($row), True);
    //Or $row = (array)$row;
    fputcsv($handle, array( $row['id'], $row['name'], $row['phonenumber'], $row['email'],$row['umur'], $row['tempattinggal'],$row['bank'], $row['kartukredit'], $row['rumah'],$row['keluarnegeri'], $row['penghasilan'] ));
}
0 голосов
/ 22 октября 2018

Метод построителя запросов get() возвращает коллекцию , содержащую объекты stdClass.Вы можете преобразовать это в массив с помощью toArray() (это также преобразует внутренние объекты в массивы).

$table = $table->toArray();

Если хотите, вы также можете добавить select('id', 'name', ...etc.) вашему конструктору запросов, чтобы указать нужные столбцы.Если вы сделаете это, то вы можете записать в файл с помощью

fputcsv($handle, $row);

, а не создавать там новый массив.

Кроме того, я не уверен в том, как вы создаетеответ на загрузку.Вы пишете в php: // output , который не записывает в файл, но Response::download() ожидает путь к файлу.Я думаю, что вам нужно либо записать результаты во временный файл, либо использовать streamDownload(), если вы не хотите создавать файл локально.

0 голосов
/ 22 октября 2018

Я думаю, это то, что вам нужно сделать:

fputcsv($handle, json_encode(array($row['id'], $row['name'], $row['phonenumber'], $row['email'],
                        $row['umur'], $row['tempattinggal'],
                        $row['bank'], $row['kartukredit'], $row['rumah'],
                        $row['keluarnegeri'], $row['penghasilan'])));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...