【发布时间】:2020-09-16 10:15:14
【问题描述】:
所以我使用 Laravel 将数据库查询生成到 csv 中,如下所示:
public function downloadVoucher(Request $req)
{
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=data.csv');
if ($req->start == "") {
$req->start = "2000-01-01";
} else if ($req->end == "") {
$req->end = "3000-31-12";
}
$output = fopen("php://output", "w");
fputcsv($output, array('No', 'Nama', 'Email', 'No Hp', 'Tanggal Redeem Voucher',
'Kode Voucher','Progress Study','Quiz Score','Date Download Certificate','Download Certificate',
'Sudah Jualan Online?', 'Deskripsi Produk', 'Instagram Toko Online', 'Marketplace Toko Online',
'Website Toko Online'));
$data = VoucherBitX::select('quiz_score.score','quiz_score.status','voucher_bit_x.track_id',
'voucher_bit_x.user_id','voucher_bit_x.redeem_at','voucher_bit_x.voucher_code','users.phone',
'users.ref_id','users.email','users.name','certificate.published', 'users.is_online_selling',
'users.selling_desc', 'users.instagram_selling_acc', 'users.marketplace_acc', 'users.online_selling_website')
->where("voucher_bit_x.status",0)
->whereDate("voucher_bit_x.redeem_at", ">=", $req->start)
->whereDate("voucher_bit_x.redeem_at", "<=", $req->end)
->leftJoin('users','users.id','=','voucher_bit_x.user_id')
->leftJoin("certificate",function($join){
$join->on("certificate.user_id","=","voucher_bit_x.user_id")
->on("certificate.track_id","=","voucher_bit_x.track_id");
})
->leftJoin("quiz_score",function($join){
$join->on("quiz_score.user_id","=","voucher_bit_x.user_id")
->on("quiz_score.track_id","=","voucher_bit_x.track_id");
})
->orderBy("voucher_bit_x.redeem_at","DESC")
->get();
$no = 0;
foreach ($data as $key => $value) {
$no = $no+1;
$urlQr = "";
$solve = Track::userProgress($value->user_id,$value->track_id);
$solve .="%";
if(!empty($value->status)){
$track = Track::find($value->track_id);
$urlQr = 'https://connect.xxxx.id/api/certificate/'.base64_encode(json_encode(["user_id"=>$value->user_id,"slug"=>$track->slug,"track_id"=>$track->id]));
}
$redeem_at = $value->redeem_at;
fputcsv($output, array($no,$value->name,$value->email,$value->phone, $redeem_at,
$value->voucher_code,$solve,isset($value->score)?$value->score:0,$value->published, $urlQr,
($value->is_online_selling == 1 ? 'Sudah' : 'Belum'), $value->selling_desc,
$value->instagram_selling_acc,$value->marketplace_acc, $value->online_selling_website));
}
fclose($output);
}
问题是,当一个字段中的数据包含换行符(输入)时,它会变成 csv 上的新行,这是一个误导性数据,它必须是一条记录($value-> sell_desc 字段之一)。我如何克服这个问题?我关注了this,但它似乎与我的问题不符。有什么建议吗?
【问题讨论】: