public static function engines($substatistic, $dynamicString)
 {
     if ($substatistic == 'Flown') {
         $partFlights = Cache::remember('stats:description:engines:flown', 60, function () {
             return PartFlight::whereIn('firststage_engine', ['Merlin 1D', 'Merlin 1D Fullthrust'])->whereHas('mission', function ($q) {
                 return $q->whereComplete();
             })->count();
         });
         if ($dynamicString === 'engineCount') {
             return $partFlights * 9;
         }
         if ($dynamicString === 'flightCount') {
             return $partFlights;
         }
     }
 }
 public function run()
 {
     // Falcon 1 Flight 1 (Done)
     PartFlight::create(array('mission_id' => 1, 'part_id' => 1, 'firststage_engine' => Engine::Merlin1A, 'firststage_engine_failures' => 1, 'landed' => false, 'note' => 'Destroyed on impact with Omelek Island reef, 80 metres from launch site'));
     PartFlight::create(array('mission_id' => 1, 'part_id' => 2, 'upperstage_engine' => Engine::Kestrel, 'upperstage_status' => 'Did not achieve orbit', 'landed' => false, 'note' => 'Never used as failure occurred before MECO. Satellite carried with second stage crashed through the roof of the Payload Integration Building and was returned to DARPA'));
     // Falcon 1 Flight 2
     PartFlight::create(array('mission_id' => 2, 'part_id' => 3, 'firststage_engine' => Engine::Merlin1A, 'firststage_meco' => 172, 'landed' => false, 'note' => 'Destroyed on reentry'));
     PartFlight::create(array('mission_id' => 2, 'part_id' => 4, 'upperstage_engine' => Engine::Kestrel, 'upperstage_status' => 'Did not achieve orbit', 'landed' => false, 'note' => 'Destroyed on reentry'));
     // Falcon 1 Flight 3
     PartFlight::create(array('mission_id' => 3, 'part_id' => 5, 'firststage_engine' => Engine::Merlin1CF1, 'firststage_meco' => 156, 'landed' => false, 'note' => 'Residual thrust caused recontact if the first and second stages'));
     PartFlight::create(array('mission_id' => 3, 'part_id' => 6, 'upperstage_engine' => Engine::Kestrel, 'upperstage_status' => 'Did not achieve orbit', 'landed' => false, 'note' => 'Residual thrust caused recontact if the first and second stages'));
     // Falcon 1 Flight 4
     PartFlight::create(array('mission_id' => 4, 'part_id' => 7, 'firststage_engine' => Engine::Merlin1CF1, 'firststage_meco' => 151, 'landed' => false));
     PartFlight::create(array('mission_id' => 4, 'part_id' => 8, 'upperstage_engine' => Engine::Kestrel, 'upperstage_status' => 'Earth Orbit', 'upperstage_seco' => 573, 'upperstage_norad_id' => 33393, 'upperstage_intl_designator' => '2008-048A', 'landed' => false, 'note' => 'First piece of SpaceX hardware to make it to orbit'));
     // Falcon 1 Flight 5
     PartFlight::create(array('mission_id' => 5, 'part_id' => 9, 'firststage_engine' => Engine::Merlin1CF1, 'firststage_meco' => 151, 'landed' => false));
     PartFlight::create(array('mission_id' => 5, 'part_id' => 10, 'upperstage_engine' => Engine::Kestrel, 'upperstage_norad_id' => 35579, 'upperstage_intl_designator' => '2009-037B', 'landed' => false));
     // DSQU
     PartFlight::create(array('mission_id' => 6, 'part_id' => Part::where('name', 'F9-001')->first()->part_id, 'firststage_engine' => Engine::Merlin1CF9, 'landed' => false));
     PartFlight::create(array('mission_id' => 6, 'part_id' => Part::where('name', 'F9-001-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1CVac, 'upperstage_norad_id' => 36595, 'upperstage_intl_designator' => '2010-026A', 'landed' => false));
     // COTS1
     PartFlight::create(array('mission_id' => 7, 'part_id' => Part::where('name', 'F9-002')->first()->part_id, 'firststage_engine' => Engine::Merlin1CF9, 'landed' => false));
     PartFlight::create(array('mission_id' => 7, 'part_id' => Part::where('name', 'F9-002-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1CVac, 'upperstage_norad_id' => 37253, 'upperstage_intl_designator' => '2010-066K', 'landed' => false));
     // COTS2+
     PartFlight::create(array('mission_id' => 8, 'part_id' => Part::where('name', 'F9-003')->first()->part_id, 'firststage_engine' => Engine::Merlin1CF9, 'landed' => false));
     PartFlight::create(array('mission_id' => 8, 'part_id' => Part::where('name', 'F9-003-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1CVac, 'upperstage_norad_id' => 38349, 'upperstage_intl_designator' => '2012-027B', 'landed' => false));
     // CRS-1
     PartFlight::create(array('mission_id' => 9, 'part_id' => Part::where('name', 'F9-004')->first()->part_id, 'firststage_engine' => Engine::Merlin1CF9, 'landed' => false));
     PartFlight::create(array('mission_id' => 9, 'part_id' => Part::where('name', 'F9-004-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1CVac, 'upperstage_norad_id' => 38848, 'upperstage_intl_designator' => '2012-054C', 'landed' => false));
     // CRS-2
     PartFlight::create(array('mission_id' => 10, 'part_id' => Part::where('name', 'F9-005')->first()->part_id, 'firststage_engine' => Engine::Merlin1CF9, 'landed' => false));
     PartFlight::create(array('mission_id' => 10, 'part_id' => Part::where('name', 'F9-005-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1CVac, 'upperstage_norad_id' => 39116, 'upperstage_intl_designator' => '2013-010B', 'landed' => false));
     // CASSIOPE
     PartFlight::create(array('mission_id' => 11, 'part_id' => Part::where('name', 'F9-006')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 11, 'part_id' => Part::where('name', 'F9-006-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'upperstage_norad_id' => 39271, 'upperstage_intl_designator' => '2013-055G', 'landed' => false));
     // SES-8
     PartFlight::create(array('mission_id' => 12, 'part_id' => Part::where('name', 'F9-007')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 12, 'part_id' => Part::where('name', 'F9-007-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'upperstage_norad_id' => 39461, 'upperstage_intl_designator' => '2013-071B', 'landed' => false));
     // Thaicom 6
     PartFlight::create(array('mission_id' => 13, 'part_id' => Part::where('name', 'F9-008')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 13, 'part_id' => Part::where('name', 'F9-008-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'upperstage_norad_id' => 39501, 'upperstage_intl_designator' => '2014-002B', 'landed' => false));
     // CRS-3
     PartFlight::create(array('mission_id' => 14, 'part_id' => Part::where('name', 'F9-009')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 14, 'part_id' => Part::where('name', 'F9-009-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // OG1
     PartFlight::create(array('mission_id' => 15, 'part_id' => Part::where('name', 'F9-010')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 15, 'part_id' => Part::where('name', 'F9-010-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // AsiaSat 8
     PartFlight::create(array('mission_id' => 16, 'part_id' => Part::where('name', 'F9-011')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 16, 'part_id' => Part::where('name', 'F9-011-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // AsiaSat 6
     PartFlight::create(array('mission_id' => 17, 'part_id' => Part::where('name', 'F9-013')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 17, 'part_id' => Part::where('name', 'F9-013-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // CRS-4
     PartFlight::create(array('mission_id' => 18, 'part_id' => Part::where('name', 'F9-012')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 18, 'part_id' => Part::where('name', 'F9-012-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // CRS-5
     PartFlight::create(array('mission_id' => 19, 'part_id' => Part::where('name', 'F9-014')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 19, 'part_id' => Part::where('name', 'F9-014-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // DSCOVR
     PartFlight::create(array('mission_id' => 20, 'part_id' => Part::where('name', 'F9-015')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 20, 'part_id' => Part::where('name', 'F9-015-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // EutelSat 115W B & ABS-3A
     PartFlight::create(array('mission_id' => 21, 'part_id' => Part::where('name', 'F9-016')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 21, 'part_id' => Part::where('name', 'F9-016-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // CRS-6
     PartFlight::create(array('mission_id' => 22, 'part_id' => Part::where('name', 'F9-018')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 22, 'part_id' => Part::where('name', 'F9-018-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // TurkmenAlem
     PartFlight::create(array('mission_id' => 23, 'part_id' => Part::where('name', 'F9-017')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 23, 'part_id' => Part::where('name', 'F9-017-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // CRS-7
     PartFlight::create(array('mission_id' => 24, 'part_id' => Part::where('name', 'F9-020')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 24, 'part_id' => Part::where('name', 'F9-020-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
     // Orbcomm OG2 Launch 2
     PartFlight::create(array('mission_id' => 25, 'part_id' => Part::where('name', 'F9-021')->first()->part_id, 'firststage_engine' => Engine::Merlin1DFullThrust, 'landed' => true));
     PartFlight::create(array('mission_id' => 25, 'part_id' => Part::where('name', 'F9-021-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVacFullThrust, 'landed' => false));
     // Jason-3
     PartFlight::create(array('mission_id' => 26, 'part_id' => Part::where('name', 'F9-019')->first()->part_id, 'firststage_engine' => Engine::Merlin1D, 'landed' => false));
     PartFlight::create(array('mission_id' => 26, 'part_id' => Part::where('name', 'F9-019-US')->first()->part_id, 'upperstage_engine' => Engine::Merlin1DVac, 'landed' => false));
 }
 private function managePartFlightRelations()
 {
     $currentPartFlights = $this->mission->partFlights->keyBy('part_flight_id');
     foreach ($this->input['mission']['part_flights'] as $partFlightInput) {
         // If the partFlight exists, update it, otherwise, create it
         if (array_key_exists('part_flight_id', $partFlightInput)) {
             $partFlight = $currentPartFlights->pull($partFlightInput['part_flight_id']);
         } else {
             $partFlight = new PartFlight();
         }
         // Create part if it is not being reused or otherwise find it
         $partInput = array_pull($partFlightInput, 'part');
         $part = array_key_exists('part_id', $partInput) ? Part::find($partInput['part_id']) : new Part();
         $part->fill($partInput);
         $part->save();
         $partFlight->part()->associate($part);
         $partFlight->mission()->associate($this->mission);
         $partFlight->save();
     }
     // Delete any remaining partflights
     if (!$currentPartFlights->isEmpty()) {
         $partFlightsToDelete = PartFlight::whereIn('part_flight_id', $currentPartFlights->keys());
         // For each partFlight, if it has a part which has not been used elsewhere, also delete it
         foreach ($partFlightsToDelete as $partFlightToDelete) {
             if ($partFlight->part()->partFlights()->count() > 1) {
                 $partFlightToDelete->part()->delete();
             }
             $partFlightToDelete->delete();
         }
     }
 }
 /**
  * @param $substatistic
  * @return int
  */
 public static function upperStages($substatistic)
 {
     if ($substatistic == 'In Orbit') {
         return PartFlight::where('upperstage_status', 'In Orbit')->count();
     } else {
         if ($substatistic == 'TLEs') {
             return DB::table('orbital_elements')->count();
         }
     }
 }