db->prepare( 'SELECT * FROM %i WHERE `id` = %d LIMIT 1', $this->table( 'schedule_overrides' ), $id ); $row = $this->db->get_row( $sql, ARRAY_A ); return is_array( $row ) ? $this->hydrate( $row ) : null; } /** * Find by owner date range. * * {@inheritDoc} * * @param ScheduleOwnerType $owner_type Parameter. * @param int $owner_id Parameter. * @param DateTimeImmutable $from_local Parameter. * @param DateTimeImmutable $to_local Parameter. * @since 0.1.0 */ public function find_by_owner_date_range( ScheduleOwnerType $owner_type, int $owner_id, DateTimeImmutable $from_local, DateTimeImmutable $to_local ): array { $sql = $this->db->prepare( 'SELECT * FROM %i WHERE `owner_type` = %s AND `owner_id` = %d AND `date_local` >= %s AND `date_local` <= %s ORDER BY `date_local` ASC', $this->table( 'schedule_overrides' ), $owner_type->value, $owner_id, $from_local->format( 'Y-m-d' ), $to_local->format( 'Y-m-d' ) ); $rows = $this->db->get_results( $sql, ARRAY_A ); if ( ! is_array( $rows ) ) { return []; } $out = []; foreach ( $rows as $row ) { $out[] = $this->hydrate( $row ); } return $out; } /** * Save. * * {@inheritDoc} * * @param ScheduleOverride $override Parameter. * @since 0.1.0 */ public function save( ScheduleOverride $override ): void { $data = [ 'owner_type' => $override->owner_type()->value, 'owner_id' => $override->owner_id(), 'date_local' => $override->date_local()->format( 'Y-m-d' ), 'is_closed' => $override->is_closed() ? 1 : 0, 'start_local' => $override->start_local(), 'end_local' => $override->end_local(), 'reason' => $override->reason(), ]; if ( null === $override->id() ) { $this->db->insert( $this->table( 'schedule_overrides' ), $data ); $override->assign_id( $this->last_insert_id() ); return; } $this->db->update( $this->table( 'schedule_overrides' ), $data, [ 'id' => $override->id() ] ); } /** * Delete. * * {@inheritDoc} * * @param ScheduleOverride $override Parameter. * @since 0.1.0 */ public function delete( ScheduleOverride $override ): void { if ( null === $override->id() ) { return; } $this->db->delete( $this->table( 'schedule_overrides' ), [ 'id' => $override->id() ] ); } /** * Map a database row to an entity. * * @param array $row Database row. */ private function hydrate( array $row ): ScheduleOverride { $utc = new DateTimeZone( 'UTC' ); return new ScheduleOverride( (int) $row['id'], ScheduleOwnerType::from( (string) $row['owner_type'] ), (int) $row['owner_id'], new DateTimeImmutable( (string) $row['date_local'] . ' 00:00:00', $utc ), (bool) (int) $row['is_closed'], null !== $row['start_local'] ? (string) $row['start_local'] : null, null !== $row['end_local'] ? (string) $row['end_local'] : null, null !== $row['reason'] ? (string) $row['reason'] : null, ); } }