Wyłącz Elokwentne znaczniki czasu Laravela

186

Jestem w trakcie konwersji jednej z naszych aplikacji internetowych z CodeIgniter na Laravel. Jednak w tej chwili nie chcemy dodawać pól updated_at/ created_atdo wszystkich naszych tabel, ponieważ mamy klasę rejestrującą, która robi to wszystko bardziej szczegółowo dla nas.

Wiem, że mogę ustawić $timestamps = false;:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

Wolałbym jednak nie zmieniać pliku podstawowego dla Laravela, ani nie chcę, aby każdy z moich modeli miał go na górze. Czy jest jakiś sposób, aby wyłączyć to gdzie indziej dla wszystkich modeli?

projectxmatt
źródło

Odpowiedzi:

360

Musisz zadeklarować public $timestamps = false;w każdym modelu lub utworzyć model BaseModel, zdefiniować go tam, a wszystkie modele rozszerzyć go zamiast elokwentnego. Tylko pamiętaj, że tabele przestawne MUSZĄ mieć znaczniki czasu, jeśli używasz Eloquent.

Aktualizacja: Należy pamiętać, że znaczniki czasu nie są już WYMAGANE w tabelach przestawnych po Laravel v3.

Aktualizacja: możesz także wyłączyć znaczniki czasu, usuwając $table->timestamps()z migracji.

bgallagh3r
źródło
1
Nie wiem, dlaczego nigdy nie myślałem o stworzeniu BaseModel i ustawieniu go tam. Działa pięknie. Tylko uwaga zgodna z tabelami przestawnymi dokumentacji jest potrzebna tylko wtedy, gdy teraz ustawiasz za pomocąTimestamps () (nie wiem, czy zmieniło się to od poprzednich wersji)
projectxmatt
Nie wiedział o metodzie withTimestamps (). Będę musiał to sprawdzić.
bgallagh3r
@ bgallagh3r, czy jest tak czy inaczej do diasble tylko dla zapytania perticuler, Powiedzmy, że dla wyświetlania fontend nie chcę znacznika czasu, ale dla backendu chcę znacznika czasu. Czy jest coś takiego?
user7747472
10
Podczas usuwania $ table-> timestamps () z migracji, elokwentny nadal będzie je uwzględniał w zapytaniu. Prowadzi to do błędu, ponieważ pole nie istnieje. W przeciwnym razie świetna odpowiedź.
Thijs Steel,
115

Po prostu umieść tę linię w swoim modelu :

public $timestamps = false;

I to wszystko!


Przykład:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Aby wyłączyć znaczniki czasu dla jednej operacji (np. W kontrolerze):

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

Aby wyłączyć znaczniki czasu dla wszystkich modeli , utwórz nowy BaseModelplik:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Następnie rozszerz każdy ze swoich modeli za pomocą BaseModel:

<?php

namespace App;

class Post extends BaseModel
{
    //
}
PhilMarc
źródło
22

Jeśli potrzebujesz tylko wyłączyć aktualizację updated_at, po prostu dodaj tę metodę do swojego modelu.

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

Spowoduje to zastąpienie nadrzędnej metody setUpdatedAtAttribute (). utworzono_at będzie działać jak zwykle. W ten sam sposób możesz napisać metodę, aby wyłączyć aktualizację tylko Created_at.

Sampath Perera
źródło
2
Działa to dla mnie, ponieważ ustawienie $ timestamps = false spowodowało, że metoda create_at-> diffForHumans () przestała działać, ponieważ nie jest już instancją typu carbon.
Nivin
Działa dla mnie, ta metoda po prostu wyłącza pole updated_at, którego potrzebuję, dzięki
Radames E. Hernandez
22

Jeśli używasz wersji 5.5.x:

const UPDATED_AT = null;

W przypadku pola „Created_at” możesz użyć:

const CREATED_AT = null;

Upewnij się, że korzystasz z najnowszej wersji. (Zostało to zepsute w Laravel 5.5.0 i naprawione ponownie w 5.5.5).

Sampath Perera
źródło
11

Elokwentny model:

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

Lub po prostu spróbuj tego

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = '[email protected]';
$users->save();
Srmilon
źródło
9

Jeśli chcesz usunąć znaczniki czasu z istniejącego modelu, jak wspomniano wcześniej, umieść to w swoim Modelu:

public $timestamps = false;

Utwórz również migrację za pomocą następującego kodu w up()metodzie i uruchom ją:

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

Można używać $table->timestamps()w down()sposób, aby umożliwić wycofywanie.

gra prawdziwa
źródło
1
To powinna być najlepsza odpowiedź. Jeśli masz istniejącą produkcyjną bazę danych, musisz uruchomić migrację, a także wyłączyć znaczniki czasu w modelu.
Brad
7

po prostu zadeklaruj publiczmienną timestamps w swoim Modelto falsei wszystko będzie działać świetnie.

public $timestamps = false;

Shahrukh Anwar
źródło
5

Dodaj tę linię do swojego modelu:

Nadpisz istniejącą zmienną $timestamps true na false

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;
Jignesh Joisar
źródło
1

Zastąp funkcje setUpdatedAt()i getUpdatedAtColumn()model

public function setUpdatedAt($value)
{
   //Do-nothing
}

public function getUpdatedAtColumn()
{
    //Do-nothing
}
Krishan
źródło
20
Przypadek „działa, ale nikt przy zdrowych zmysłach nie zrobiłby tego”
developerbmw,
1

Możesz tymczasowo wyłączyć znaczniki czasu

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
Snapey
źródło