/** * Execute the console command. * * @return mixed */ public function handle() { list($rootFolder, $current, $folder) = $this->setFolder(); $counter = 1; $measurementsCounter = 0; $file = fopen($folder . 'file' . $counter . '.csv', "w"); $maxRows = self::MAX_ROWS - 500; Measurement::with('station')->where('time', '>', Carbon::now()->subMonths(3))->orderBy('time', 'asc')->chunk(500, function ($measurements) use($folder, &$file, &$measurementsCounter, &$counter, $maxRows) { if ($measurementsCounter > $maxRows) { echo "measurements: " . $measurementsCounter . "\n"; echo "file created: " . $counter . ".csv\n"; $measurementsCounter = 0; if (is_resource($file)) { fclose($file); } $counter++; $file = fopen($folder . 'file' . $counter . '.csv', "w"); } foreach ($measurements as $measurement) { $array = $measurement->toArray(); unset($array['station_id'], $array['station']['id']); fputcsv($file, array_flatten($array)); } $measurementsCounter += 500; }); File::put($rootFolder . 'finished.txt', $current); }
/** * Shows all the weatherdata of stations on the same * longitude as Kyoto. The data displayed is one week * old. The data should only be shown if the temperature * is below 20 degrees Celsius. */ public function kyotoLongitude(Request $request) { $longitude = 135.733; $measurements = Measurement::with('station')->where('time', '>=', Carbon::now()->subWeek())->where('temperature', '<', 20)->whereHas('station', function ($sql) use($longitude) { $sql->where('longitude', '=', $longitude); })->orderBy('time', 'desc'); return view('measurement.overview', ['measurements' => $measurements->paginate(50)]); }
/** * Generate a query in which the showings are stored * @param $show - which fields need to be shown * @return mixed $query - the generated query */ private function setShow($show) { $query = Measurement::with(['station' => function ($query) use($show) { $query->select($show['stations'])->addSelect('id'); }])->select($show['measurements'])->addSelect('station_id'); return $query; }