cakePhp 4 – dodawanie rekordów do ResultSet

Pobraliśmy wyniki Model->find() w postaci ResultSet. Jak dodać kolejny ResultSet?

  • Pobieramy zdarzenia dla pasującego dnia ’data’ – jeden resultSet
  • Pobieramy zarzenia dla pasującego zakresu dat – date_from, date_to – drugi resultSet
  • W widoku będziemy używali tylko pola data – z zakresu date_from i date_to utworzymy kopie encji z kolejnymi datami data
// ====== ZDARZENIA JEDNODNIOWE =========

$query = $this->Events->find()->find('forIndex');
$query->where(function($exp) use ($data_from, $data_to) {
           return $exp->between('data', $data_from, $data_to);
       });
$events = $query->all()->toList();
// ====== ZDARZENIA ZAKRES DAT =========

$query_all = $this->Events->find()->find('forIndex');
$query_all->where(['data IS' => null]);
$query_all->where(['date_from IS NOT' => null, 'date_from >=' => $data_from]);
$query_all->where(['date_to   IS NOT' => null, 'date_to   <=' => $data_to]);
$events_all = $query_all->all();

Dołączenie drugiego zestawu do pierwszego – po korekcji

foreach($events_all as $event)
{
  // Dodajemy projekty użytkwnika dla wydarzeń całodniowych
  $from_tz = strtotime($event->date_from->format("Y-m-d"));
  $to_tz   = strtotime($event->date_to->format("Y-m-d"));

  if($from_tz < $to_tz) {
    $days = (($to_tz - $from_tz) / 86400) +1;                   // Ile dni trwa zdarzenie

    // Przechodzimy przez wszystkie dni z zakresu
    for( $tz = $from_tz; $tz <= $to_tz; $tz += 86400 ) { 

      // Tworzymy nowe zdarzenie (kopię bazowego) dla każdego dnia
      $new_event = $this->Events->newEntity($event->toArray());
      $new_event->days = $days;                                 // nowe pole
      $new_event->data = new \DateTime( date('Y-m-d', $tz) );   // Uzupełniamy pole data
      array_push($events, $new_event);                          // dodajemy rekord do pierwszego ResultSet
    }
  } 
  // Jeśli zakres dat jest taki sam
elseif ($event->date_from == $event->date_to) {
    $event->data = $event->date_from;            // uzupełniamy pole data
    array_push($events, $event);                 // Dodajemy istniejącą encję
  }
}