Salut tout le monde,
J'ai un probleme de query builder sur laravel. En effet, j'aimerais créer un document CSV sans données.
Pour créer mon CSV j'ai besoin de récupérer les en-tête de CSV avec cette fonction:
Et pour récupérer les données, j'utilise cette fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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; }
Je crée les document CSV ligne par ligne en ajoutant les valeurs les une après les autres en les séparants par une ','.:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 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; }
Donc le CSV ressort tout propre comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 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);
Pièce jointe 419965
Maintenant que tout est bon, je peux voir que à la fin de mon csv certaines data n'existe pas car elles n'ont pas été créer sur cette période de temps.
le problème:
Pièce jointe 419966
data_key reçoitapparent_wind_speed, true_wind_speed and water_speed de la requete getHeader mais par le timestamp je n'ai pas de données pour cette période. Donc, mon CSV ne crée pas de colonens avec les bonnes valeurs.
ci dessous les id manquantes pour deux timestamp, il manque la 92 à 94:
Pièce jointe 419970
Je ne trouve pas de solution pour remplir les valeurs, ni dans le CSV, ni en sql. Je souhaiterais juste créer des valeurs "null" quand les valeurs n'existe pas. J'ai essayé d'utiliser LEFT JOIN dans ma requête pour forcer MySQL à m'envoyer les ids. mais ça ne marche pas.
J'espère que vous aller m'aider. ça me rend fou.
J'essaye d'update le post si j'avance de mon côté
Merci à tous.
Partager