我很高兴认识你们。你太棒了!
因此,我在laravel上使用查询生成器遇到了问题。实际上,我想使用不存在的数据创建一个csv文件。我发出带有时间戳的请求,并且之前没有某些数据。要创建我的csv,我首先需要使用以下函数获取标头:
public static function getHeaders($sTables) {
$data = DB::connection('mysql2')
->table('data_sub_category')
->select('data_sub_category.designation as sub', 'data_key.designation as dkey')
->join('data_key', 'data_key.id_data_sub_category', '=', 'data_sub_category.id')
->whereIn('data_sub_category.id', $sTables)
->orderBy('data_sub_category.id', 'ASC')
->distinct()
->get();
return $data;
}
要获取数据,我使用以下方法:
public static function prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd) {
$data = DB::connection('mysql2')
->table('data_row')
->select('data_sub_category.designation as sub_d','data_sub_category.id as sub_id', 'data_key.designation as key_d','data_key.id as key_id','data_row.id_data as id_data', 'data_row.value', DB::raw("(DATE_FORMAT(FROM_UNIXTIME(timestamp), '%d/%m/%Y %h:%i:%s')) as timestamp"))
->join('data', 'data.id', '=', 'data_row.id_data')
->join('data_key', 'data_key.id', '=', 'data_row.id_data_key')
->join('data_sub_category', 'data_sub_category.id', '=', 'data_row.id_data_sub_category')
->join('data_category', 'data_category.id', '=', 'data_row.id_data_category')
->where('code_unique', $iIdCodeTransmetteur)
->whereIn('data_sub_category.id', $sTables)
->whereBetween('data.timestamp', array($dtStart, $dtEnd))
->orderBy('data.timestamp', 'ASC')
->orderBy('data_sub_category.id', 'ASC')
->orderBy('data_key.id','ASC')
->get();
return $data;
}
这2个函数位于名为:
的变量中 $getHeaders = Data::getHeaders($sTables);
$results = Data::prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd)->groupBy('id_data')->toArray();
然后,我逐行创建csv文件,将值一个接一个地放置,并以','分隔。最后,csv文件如下所示:
public function ajaxCreateCsv(Request $request) {
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 900000); //15 minutes
$bError = false;
$messages_errors = array();
$isSuccess = false;
$aTables = $request->tables;
$dtStart = $request->dtStart;
$dtEnd = $request->dtEnd;
$iIdCodeTransmetteur = $request->code_transmetteur;
$sTables = [];
/*
for ($i=0; $i < count($dataRow); $i++) {
$sRow .= $dataRow[$i]['value'] . ',';
}
$sRow = substr($sRow, 0, -1);
*/
if ($aTables) {
for ($i = 0; $i < count($aTables); $i++) {
array_push($sTables, intval($aTables[$i]['value']));
}
} else {
$aTables = Data::getAllGroupDataByIidForAjax($iIdCodeTransmetteur);
for ($i = 0; $i < count($aTables); $i++) {
array_push($sTables, intval($aTables[$i]->id));
}
}
$getHeaders = Data::getHeaders($sTables);
$result = Data::prepare_data_export($iIdCodeTransmetteur, $sTables, $dtStart, $dtEnd);
$line = 'Date de réception, ';
$last_timestamp = '01/01/2018 00:00:00';
if (count($result) < 1) {
$response_array['status'] = 'error';
$error_message = $error_message . "Aucune données disponible pour ces dates";
array_push($messages_errors, ["date", $error_message]);
} else {
foreach ($getHeaders as $key) {
$array = $key->sub . '.' . $key->dkey;
$line .= $array . ", ";
}
$line = substr($line, 0, -1);
foreach ($result as $key) {
$datetime = $key->timestamp;
$value = $key->value;
if ($datetime == $last_timestamp) {
if ($value == NULL) {
$value = "NULL";
}
$line .= $value . ", ";
$last_timestamp = $datetime;
} else {
$line = substr($line, 0, -1);
$line .= "\n";
$line .= $datetime . ", ";
if ($value == NULL) {
$value = "NULL";
}
$line .= $value . ", ";
$last_timestamp = $datetime;
}
}
$line = substr($line, 0, -1);
$isSuccess = true;
}
if ($isSuccess == false) {
$response_array['status'] = 'error';
$response_array['messages'] = $messages_errors;
} else {
file_put_contents("file.csv", $line);
$response_array['status'] = 'success';
}
return response()->json($response_array);
带有数据的输出csv文件
现在,该文件看起来非常不错,而且对于大多数文件来说,您是对的。尽管在行尾,有些列是空的。这是因为在数据库中,对于精确的时间戳记,一些数据不存在
问题:
data_key从请求getHeader接收表观风速,true_wind_speed和water_speed,但目前我们没有任何值。 因此,我的csv无法创建具有正确值的列。
两个不同时间戳记的值ID,缺少92到94
在csv文件或数据库中,我找不到一种填充值的方法来获取不存在该值的“空”值。我尝试在请求中使用LEFT JOIN来强制MySQL遍历所有id,甚至缺少的id,但似乎无法正常工作。
希望您能找到一种帮助的方式,我会继续努力并更新请求。