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?

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.


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
{
    //
}

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.


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).


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 = 'johndoe@example.com';
$users->save();

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.


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;


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;

1

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

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.