[LARAVEL] validate time (after/before/between)

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Mijn vraag
Ben bezig met site voor een restaurant. Nu moet er een reservering gemaakt worden door de gast, deze kan alleen tussen bepaalde tijden reserveren. (Opgeslagen in DB)

Heb al meerdere manieren geprobeerd en gezocht maar kom er niet meer uit 8)7

misschien moet ik wel zelf een Rule schrijven maar als dit niet nodig is gebruik ik liever de bestaande Rules.

Relevante software en hardware die ik gebruik
Laravel: 5.6

Wat ik al gevonden of geprobeerd heb

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
//Werkt helaas niet :P
'time' => 'date_format:"H:i"|required|between:'.$opening.','.$closing,

// werkt
'time' => 'date_format:"H:i"|required|after:'.$opening,

// werkt ook...
'time' => 'date_format:"H:i"|required|before:'.$closing,

// Ze werken alleen als er 1 van de 2 in staat. dus alle 2 in de array wordt hem niet..

// Werkte ook niet tot ik het net weer probeerde.. 
'time' => 'date_format:"H:i"|required|after:'.$opening.'|before:'.$closing,


Oplossing
Ik post alsnog mijn oplossing.. misschien kan iemand ervan leren of heeft iemand een betere oplossing.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$option = Option::first();

        $yesterday = date("Y-m-d", strtotime( '-1 days' ));
        $opening = str_replace('-', ':', date("H-i", strtotime($option->opening)));
        $closing = str_replace('-', ':', date("H-i", strtotime($option->closing)));

        $this->validate($request, [
            'firstname' => 'required|max:50',
            'middle' => 'nullable|max:20',
            'lastname' => 'required|max:50',
            'phone' => 'required|numeric|min:10',
            'email' => 'required|max:100|email',
            'persons' => 'required|numeric',
            'message' => 'max:500',
            'date' => 'required|date_format:Y-m-d|after:'.$yesterday,
            'time' => 'date_format:"H:i"|required|after:'.$opening.'|before:'.$closing,
        ],[
             'time.after' => 'The :attribute must be a time after :date.',
             'time.before' => 'The :attribute must be a time before :date.',
        ]);

        Reservation::create([
            'firstname' => $request->firstname,
            'middle' => $request->middle,
            'lastname' => $request->lastname,
            'phone' => $request->phone,
            'email' => $request->email,
            'persons' => $request->persons,
            'message' => $request->message,
            'description' => $request->description,
            'date' => $request->date,
            'time' => $request->time,
            'approved' => false
        ]);

        return redirect()->route('reservation.index')->with('success', 'Thank you for booking a table. Your reservation is confirmed when we send you a confirmation mail. ');
    }

Beste antwoord (via Groax op 04-07-2018 01:01)


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
of
PHP:
1
2
3
$request->request->add([
    'days_open' => in_array($nameOfDay, explode(', ', $option->days_open))
]);

Maak je niet druk, dat doet de compressor maar

Alle reacties


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je hebt dit nodig:
SQL:
1
WHERE open_time <= option_arrive_time AND close_time >= option_depart_time

Maar meestal heb je geen option_depart_time en werkt restaurant in shifts.
Ik kan ook prima er zijn tot 23:00u terwijl de keuken dicht ging om 21:00u.
Daarnaast kan het restaurant dicht zijn op maandag en in het weekend andere open/sluit tijden hanteren.
Je hebt dus te weinig info gegeven om dit op te lossen voor elke use-case.

Je oplossing geeft wel een simpele basis voor anderen.

[ Voor 72% gewijzigd door DJMaze op 03-07-2018 15:26 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Ooh ik ben er nog lang niet klaar mee hoor :)

Volgende stap is inderdaad de open dagen en keuken tijden ipv sluit tijden aangezien dit restaurant andere tijden daarvoor heeft

Acties:
  • +1 Henk 'm!

  • ikvanwinsum
  • Registratie: Februari 2011
  • Laatst online: 07-09 17:56

ikvanwinsum

/dev/null

Tip: in plaats van
moese schreef op dinsdag 3 juli 2018 @ 14:39:


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        $this->validate($request, [
            'firstname' => 'required|max:50',
            'middle' => 'nullable|max:20',
            'lastname' => 'required|max:50',
            'phone' => 'required|numeric|min:10',
            'email' => 'required|max:100|email',
            'persons' => 'required|numeric',
            'message' => 'max:500',
            'date' => 'required|date_format:Y-m-d|after:'.$yesterday,
            'time' => 'date_format:"H:i"|required|after:'.$opening.'|before:'.$closing,
        ],[
             'time.after' => 'The :attribute must be a time after :date.',
             'time.before' => 'The :attribute must be a time before :date.',
        ]);

        Reservation::create([
            'firstname' => $request->firstname,
            'middle' => $request->middle,
            'lastname' => $request->lastname,
            'phone' => $request->phone,
            'email' => $request->email,
            'persons' => $request->persons,
            'message' => $request->message,
            'description' => $request->description,
            'date' => $request->date,
            'time' => $request->time,
            'approved' => false
        ]);
is het ook mogelijk om je model gelijk te vullen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$validated = $this->validate($request, [
        'firstname' => 'required|max:50',
        'middle' => 'nullable|max:20',
        'lastname' => 'required|max:50',
        'phone' => 'required|numeric|min:10',
        'email' => 'required|max:100|email',
        'persons' => 'required|numeric',
        'message' => 'max:500',
        'date' => 'required|date_format:Y-m-d|after:'.$yesterday,
        'time' => 'date_format:"H:i"|required|after:'.$opening.'|before:'.$closing,
    ],[
         'time.after' => 'The :attribute must be a time after :date.',
         'time.before' => 'The :attribute must be a time before :date.',
]);

Reservation::create($validated);

U zegt: ‘Alles is toegestaan.’ Zeker, maar niet alles is goed. Alles is toegestaan, maar niet alles is opbouwend.


Acties:
  • +1 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
OOH!!!! thx! die wist ik dus niet he.... Jaren Laravel en leer nog steeds haha
ikvanwinsum schreef op dinsdag 3 juli 2018 @ 16:09:
Tip: in plaats van

[...]


is het ook mogelijk om je model gelijk te vullen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$validated = $this->validate($request, [
        'firstname' => 'required|max:50',
        'middle' => 'nullable|max:20',
        'lastname' => 'required|max:50',
        'phone' => 'required|numeric|min:10',
        'email' => 'required|max:100|email',
        'persons' => 'required|numeric',
        'message' => 'max:500',
        'date' => 'required|date_format:Y-m-d|after:'.$yesterday,
        'time' => 'date_format:"H:i"|required|after:'.$opening.'|before:'.$closing,
    ],[
         'time.after' => 'The :attribute must be a time after :date.',
         'time.before' => 'The :attribute must be a time before :date.',
]);

Reservation::create($validated);

Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Mijn oplossing.

PHP:
1
2
3
4
5
6
7
8
9
10
11
$date = date($request->date);
$nameOfDay = date('l', strtotime($date));

$day = false;
if(in_array($nameOfDay, explode(',', $option->days_open))){$day = true;}

// $this->validate
'date' => 'required|date_format:Y-m-d|after:'.$yesterday.'|accepted:'.$day,

// Message
'date.accepted' => $option->name_restaurant . ' is closed this day.',


Waarom zou ik dit oplossen in SQL??
Laravel heeft hier zulk mooie functies voor :)
DJMaze schreef op dinsdag 3 juli 2018 @ 15:16:
Je hebt dit nodig:
SQL:
1
WHERE open_time <= option_arrive_time AND close_time >= option_depart_time

Maar meestal heb je geen option_depart_time en werkt restaurant in shifts.
Ik kan ook prima er zijn tot 23:00u terwijl de keuken dicht ging om 21:00u.
Daarnaast kan het restaurant dicht zijn op maandag en in het weekend andere open/sluit tijden hanteren.
Je hebt dus te weinig info gegeven om dit op te lossen voor elke use-case.

Je oplossing geeft wel een simpele basis voor anderen.

[ Voor 4% gewijzigd door Groax op 04-07-2018 00:33 . Reden: vergat iets.. ]


Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
@moese redelijk, echter is date('l') een taal (Sunday, Zondag, Sonntag, etc.)
Beter om 'N' (ISO-8601 numerieke dag) te gebruiken.

Het hoeft niet in SQL, maar mijn restaurant DB vertelt per dag de openingstijden omdat dit wisselt.
Ze zijn bijvoorbeeld op zondag dicht, behalve bij een voetbalwedstrijd :D
En in de zomer als het lekker weer is kan je al om 11:00u lunchen op het terras.

Succes met de breinbrekers!

[ Voor 55% gewijzigd door DJMaze op 04-07-2018 00:40 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
dude... je hebt helemaal gelijk he.... ga dat meteen even wijzigen...

Kleine edit met de vorige! dit werkt dus niet. haha

moet dit zijn:

PHP:
1
2
3
4
5
6
7
8
9
$day = false;
if(in_array($nameOfDay, explode(', ', $option->days_open))){$day = true;}
$request->request->add(['days_open' => $day]);

// $this->validate
'days_open' => 'accepted',

// Message
'days_open.accepted' => $option->name_restaurant . ' is closed this day.',

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
of
PHP:
1
2
3
$request->request->add([
    'days_open' => in_array($nameOfDay, explode(', ', $option->days_open))
]);

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Groax
  • Registratie: Oktober 2012
  • Laatst online: 18-08 11:58
Kan ook :)
is ook nog is korter ook.
DJMaze schreef op woensdag 4 juli 2018 @ 00:59:
of
PHP:
1
2
3
$request->request->add([
    'days_open' => in_array($nameOfDay, explode(', ', $option->days_open))
]);
Pagina: 1