Я очень рад познакомиться с вами, ребята.ты потрясающий!
Итак, у меня проблема с компоновщиком запросов на 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 получает visible_wind_speed, true_wind_speed и water_speed из запроса getHeader, но длятеперь у нас нет для них ценности.Таким образом, мой CSV не создает столбцы с правильными значениями.
идентификатор значений для двух разных временных отметок, пропуская 92 до 94
Я могу 't найти способ заполнить значения либо в файле csv, либо в базе данных, чтобы получить «нулевое» значение, если значение не существует.Я попытался использовать LEFT JOIN в своем запросе, чтобы заставить MySQL запускать все идентификаторы, даже пропущенные, но, похоже, это не сработало.
Надеюсь, вы найдете способ помочь,Я продолжу работать над этим и обновлю запрос.