不能将stdClass类型的对象用作数组

时间:2018-10-22 15:40:00

标签: php laravel

当我使用get方法时,我使用post方法使用带有fputcsv的php下载csv,但是使用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上,当我删除for时,我可以下载csv,但是格式不正确

3 个答案:

答案 0 :(得分:0)

我认为这是您需要做的:

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'])));

答案 1 :(得分:0)

我认为您代码的问题在于,当从数据库中获取记录时,它们将作为对象返回,并且您试图像使用数组一样使用该对象。

您有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'] ));
}

答案 2 :(得分:0)

查询构建器get()方法返回一个包含stdClass对象的collection。您可以使用toArray()将其转换为数组(还将内部对象转换为数组)。

$table = $table->toArray();

如果愿意,还可以向查询构建器添加select('id', 'name', ...etc.),以指定所需的列。如果这样做,则可以使用

写入文件
fputcsv($handle, $row);

而不是在那里建立新的数组。

此外,我不确定您创建下载响应的方式。您正在写入php://output,该文件没有写入文件,但是Response::download()需要一个文件路径。我认为您或者需要将结果写入临时文件,或者如果您不想在本地创建文件,请使用streamDownload()