Un query în Laravel îmi actualizează data (și nu ar trebui)

Buna! Va rog sa ma ajutati sa rezolv aceasta problema. Lucrez la o aplicatie in Laravel. Am un camp cu numele daytime de tipul timestamptz in tabelul chaircallendars care pastreaza situatia din ora in ora a locurilor libere dintr-o sala.

public function up()
    {
        Schema::create('chaircallendars', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('availability')->default(15);
            $table->float('rate')->default(9);
            $table->timestamptz('daytime');
            
        });
    }

Datele din tabel se modifica atunci cand un utilizator face o rezervare. Problema este ca la fiecare modificare in tabel, campul respectiv primeste automat valoarea datei curente (se comporta ca si campul updated_at).

                            $time=$reservationtime; 
                            for ($i=1; $i<=$hours; $i++)
                               {
                                $chaircallendar = Chaircallendar :: where('daytime', $time) -> get();
                                $chaircallendar -> availability  = $chaircallendar -> availability - $chairs;
                                $chaircallendar -> save();
                                $time=date("Y-m-d H:i:s",strtotime($time)+3600);
                               }

Valoarea initiala a lui $time este preluata din calendar.
M-am uitat peste documentatie si am vazut ca date() returneaza data curenta, intr-adevar, in lipsa celui de-al doilea argument. M-am gandit si eu ca problema ar putea sa apara de aici, dar culmea este ca return dd($time) mi-a afisat valoarea corecta. Chiar si return dd($chaircallendar->daytime) dupa $chaircallendar->save(). In baza de date, insa, lucrurile stau cu totul altfel…:frowning:

Mi-am rezolvat dilema. Presupun ca frameworkul imi interpreta campul ca pe updated_at. Ca sa nu se mai intample asta, a trebuit sa introduc campul daytime dupa updated_at

public function up()
    {
        Schema::create('chaircallendars', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('availability')->default(15);
            $table->integer('reservations')->default(0);
            $table->float('rate')->default(9);
            $table->timestamps();
            $table->timestampTz('daytime')->nullable();
            
            
        });
    }
1 Like

Nu înțeleg de ce nu folosești un câmp standard datetime?
E ceva ce nu am observat?

1 Like

Multumesc, Emanuel.
De fapt, acum am realizat ca problema principala asta era! Datele de tipul timestamps se actualizeaza adesea automat atunci cand o inregistrare e modificata.

public function up()
    {
        Schema::create('chaircallendars', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('availability')->default(15);
            $table->integer('reservations')->default(0);
            $table->float('rate')->default(9);
            $table->datetime('daytime');
            $table->timestamps();
            
        });
    }
1 Like

Da, de asta am întrebat, pentru că nu am înţeles de ce foloseai acel tip, eu ştiam că datetime este pentru stocarea datelor de tip date time.

Timestamp de obicei, ca şi concept, e un timestamp al atunci când se întâmplă o anume acţiune, se folosea cu mult înainte de inventarea calculatoarelor.

Credeam că intenţionat foloseşti timestamp pentru că vrei să înregistrezi acţiunea, dar mysql prin timestamp oricum deja are conceptul respectiv automatizat, la fel şi laravel, credeam că vrei să faci ceva diferit şi nu observam eu :slight_smile:

Totul a plecat de la un programul care imi genereaza datele in tabelul chiar callendars. A trebuit sa generez valori pentru daytime incepand de la o data, pentru un anumir numar de zile, din ora in ora,intr-un interval orar (intre 8 si 17) , exceptand zilele de duminica. De aici a plecat totul. Ca sa construiesc valoarea corect am cautat documentatie, am gasit printre altele recomandarea timestamp, m-am concentrat pe program si nu m-am gandit la alte aspecte.