当我使用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,但是格式不正确
答案 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()
。