Laravel dodawanie dat powtarzających w jakimś okresie

0

Witam, tworzę api do nazwijmy to planie zajęc w którym kiedy użytkownik dodaję datę lekcji może ustawić powtarzającą się datę, moja baza danych wygląda następująco:

Plans
id int
start_date datetime
end_date datetime
name varchar

Activities
id int
name varchar
Plans_idPlan id
periodicity enum("1"."0")

Activities_dates
id int
start_date datetime
end_date datetime
Activities_idActivities

Jak zrobili byście rozwiązanie z dodawaniem do bazy tych godzin? pętla for i dodawanie dat aż napotka datę zakończenia? jest to dobre rozwiązanie? pętla będzie sie wykonywać tylko jeżeli flaga powtarzania zajęć jest zaznaczona?

Dzięki za pomoc! :)

Btw. Dzięki temu forum właśnie napisałem swoje 1 API które naprawdę działa świetnie i to jest ostatnia funkcjonalność jakiej potrzebuję a aplikacja dla której to tworzę (dla samego siebie) jest naprawdę nie taka łatwa, dlatego wam za to dziękuję! Jak tylko wrzucę API aby stało online to podeślę wam, może się akurat komuś przyda :)

  • takie offttopy

-czy znacie może jakieś fajne darmowe serwery ftp? potrzebuję do wrzucania zdjęć i pliczków nie musi być nie wiadomo jak wielki rozmiar nawet kilkadziesiąt mb powinno starczyć :)

-jaki hosting polecacie na api laravela? jakieś rady przy stawianiu api online? czy jest to tak samo łatwe jak ze stawianiem bazy?

0

Chyba musiałbyś przemyśleć jakie masz warunki brzegowe. Jeśli można np. wybrać powtarzanie co tydzień i tak ustawić powtarzanie tych zajęć na 10 tygodni, ale potem możemy sobie odwołać poszczególne w środku, to podejście z dodaniem pojedynczych rekordów w pętli jest ok. Jeśli jednak taki przypadek nie może mieć miejsca, a takich rekordów w pętli będziesz dodawać nie 5 a 500, to lepiej byłoby po prostu dać jakąś metodę w kodzie lub procedurę w DB do wyswietlania, a w bazie zapisywać tylko start, koniec, okres. Potem wyświetlasz sobie poszczególne daty już z użyciem tej metody.

0

Próbuję właśnie robić w 1 i w 2 stronę i nie bardzo idzie... ogólnie to jest moja funkcja dodająca daty do bazy danych, myślałem nad użyciem po prostu

INTERVAL

lub
addDays(7);
ale głupio się przyznać ale nie potrafię za bardzo tego obsłużyć aby do zwalidowanych rekordów dodawano jakąś wartość i dodawało do daty te 7 dni.
screenshot-20201212223834.png
myślę że dodawanie będzie jednak lepszym sposobemscreenshot-20201212223757.png

0

Masz bilbiotekę Carbon do dyspozycji w Laravel.
https://carbon.nesbot.com/
Możesz napisać taką metodę:

public function showPeriodicActivities(string $startDate, string $endDate, int $periodic): array
{
    $activities = [];
    $startDate = Carbon::createFromFormat('Y-m-d H:i',$startDate);
    $endDate = Carbon::createFromFormat('Y-m-d H:i',$endDate);
    while ($startDate->lessThan($endDate))
    {
        $activieties[] = $startDate;
        $startDate = $startDate->addDay($periodic);
    }
    return $activities;
}

Pisane z palca, żeby pokazać mniej więcej o co mi chodziło, może nie działać. Metodę możesz zmodyfikować i użyć do zapisu zdarzeń. Pamiętaj, że standardowo Laravel w modelu zwraca właśnie daty od razu jako obiekt klasy Carbon.

0

@jurek1980: Wyszło mi z twojego pomysłu coś takiego:

public function createActivityDate(Request $request,$planId,$activityId)
    {
        $user=auth()->user();
        $endPlanDate=DB::table('activities')
            ->join('plans','plans.id','=','activities.Plans_idPlan')
           ->where('plans.Users_idUser','=',$user->id)
            ->where('activities.Plans_idPlan','=',$planId)
            ->value('plans.end_date');
        $startPlanDate=DB::table('activities')
            ->join('plans','plans.id','=','activities.Plans_idPlan')
            ->where('plans.Users_idUser','=',$user->id)
            ->where('activities.Plans_idPlan','=',$planId)
            ->value('plans.start_date');
        $endPlanDate = Carbon::createFromFormat('Y-m-d',$endPlanDate)->addDays(1);;
        $startPlanDate = Carbon::createFromFormat('Y-m-d',$startPlanDate)->addDays(-1);;

            $validator = Validator::make($request->all(), [
                'start_date' => 'required|before_or_equal:'.$endPlanDate.'|after_or_equal:'.$startPlanDate,
                'end_date' => 'required|after_or_equal:start_date|before_or_equal:'.$endPlanDate,
                'Activities_idActivities' => '',
            ]);
            $constant_values_array = array('Activities_idActivities' => $activityId);
            if ($validator->fails()) {
                return response()->json($validator->errors()->toJson(), 400);
            }
            while($endPlanDate->lessThan(datavaluezkoniec)) {
                $activityDate = Activity_date::create(array_merge(
                    $constant_values_array,
                    $validator->validated()
                ));
                datazvaluepoczatek = Carbon::createFromFormat('Y-m-d H:i',$endPlanDate)->addDays(7);
                datazvaluekoniec = Carbon::createFromFormat('Y-m-d H:i',$startPlanDate)->addDays(7);

            }

    return response()->json([
        'message' => 'Dodałeś datę przedmiotu',
        'activity' => $activityDate
    ], 201);
}

myślę że to będzie działać tylko mam 1 pytanko, w jaki sposób wyciągnąć wartość którą dostaje z frontu o dacie początkowej i końcowej kiedy jest w obiekcie $validator?

0

Masz błąd na pewno w porównaniu dat:

$startDate->lessThan($endDate)
// u Ciebie na funkcji wywłoułejsz zmienną a to nie powinno zadziałać :)
$startDate->lessThan->$endDate

Z tego co pamiętam to po wywołaniu $resultArray = $validator->validated() w wyniku otrzymasz tablicę poprawnie zwalidowanych pól, jeśli o to Ci chodzi.

0

@jurek1980:Dziękuję!
Chodzi mi o zwrócenie pojedyńczej zwalidowanej wartości np. startDate dla activity bo start date i end date z planu zajec juz mam

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0