Deaktivieren Sie Laravels eloquente Zeitstempel

184

Ich bin gerade dabei, eine unserer Webanwendungen von CodeIgniter nach Laravel zu konvertieren. In diesem Moment möchten wir jedoch nicht die updated_at/ created_at-Felder zu allen unseren Tabellen hinzufügen, da wir eine Protokollierungsklasse haben, die dies alles bereits ausführlicher für uns erledigt.

Ich bin mir bewusst, dass ich Folgendes einstellen kann $timestamps = false;:

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

Ich möchte jedoch lieber keine Kerndatei für Laravel ändern oder alle meine Modelle haben diese oben. Gibt es eine Möglichkeit, dies für alle Modelle an anderer Stelle zu deaktivieren?

projectxmatt
quelle

Antworten:

358

Sie müssen entweder public $timestamps = false;in jedem Modell deklarieren oder ein BaseModel erstellen, es dort definieren und von allen Modellen erweitern lassen, anstatt beredt zu sein. Denken Sie nur daran, dass Pivot-Tabellen Zeitstempel haben MÜSSEN, wenn Sie Eloquent verwenden.

Update: Beachten Sie, dass Zeitstempel in Pivot-Tabellen nach Laravel v3 nicht mehr erforderlich sind.

Update: Sie können Zeitstempel auch deaktivieren, indem Sie sie $table->timestamps()aus Ihrer Migration entfernen .

bgallagh3r
quelle
1
Ich weiß nicht, warum ich nie daran gedacht habe, ein BaseModel zu erstellen und dort einzurichten. Funktioniert wunderbar. Nur ein Hinweis gemäß der Dokumentation Pivot-Tabellen benötigen es nur, wenn jetzt mit Timestamps () gesetzt wird (weiß nicht, ob sich dies gegenüber früheren Versionen geändert hat)
projectxmatt
Die Methode withTimestamps () war mir nicht bekannt. Ich muss mich darum kümmern.
Bgallagh3r
@ bgallagh3r, gibt es sowieso nur für Perticuler-Abfragen zu diaseln, sagen wir für die Fontend-Anzeige, ich möchte keinen Zeitstempel, aber für das Backend möchte ich einen Zeitstempel. Gibt es sowieso dazu?
user7747472
8
Wenn Sie $ table-> timestamps () aus der Migration entfernen, werden sie von eloquent weiterhin in die Abfrage aufgenommen. Dies führt zu einem Fehler, da das Feld nicht vorhanden ist. Ansonsten tolle Antwort.
Thijs Steel
114

Platzieren Sie diese Zeile einfach in Ihrem Modell :

public $timestamps = false;

Und das ist es!


Beispiel:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

So deaktivieren Sie Zeitstempel für eine Operation (z. B. in einer Steuerung):

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

Erstellen Sie eine neue Datei, um Zeitstempel für alle Ihre Modelle zu deaktivieren BaseModel:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Erweitern Sie dann jedes Ihrer Modelle mit den folgenden BaseModelAngaben:

<?php

namespace App;

class Post extends BaseModel
{
    //
}
PhilMarc
quelle
22

Wenn Sie nur die Aktualisierung von update_at deaktivieren müssen, fügen Sie diese Methode einfach Ihrem Modell hinzu.

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

Dadurch wird die übergeordnete Methode setUpdatedAtAttribute () überschrieben. created_at funktioniert wie gewohnt. Auf die gleiche Weise können Sie eine Methode schreiben, um die Aktualisierung nur von created_at zu deaktivieren.

Sampath Perera
quelle
2
Dies hat bei mir funktioniert, da durch das Festlegen von $ timestamps = false die Methode created_at-> diffForHumans () nicht mehr funktioniert, da es sich nicht mehr um eine Carbon-Instanz handelt.
Nivin
Es funktioniert für mich, diese Methode deaktiviert nur das Feld update_at, das ich brauche, danke
Radames E. Hernandez
21

Wenn Sie 5.5.x verwenden:

const UPDATED_AT = null;

Und für das Feld 'created_at' können Sie Folgendes verwenden:

const CREATED_AT = null;

Stellen Sie sicher, dass Sie auf der neuesten Version sind. (Dies wurde in Laravel 5.5.0 gebrochen und in 5.5.5 erneut behoben).

Sampath Perera
quelle
10

Beredtes Modell:

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

    public $timestamps = false;
}

Oder versuchen Sie es einfach

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = '[email protected]';
$users->save();
srmilon
quelle
9

Wenn Sie wie zuvor erwähnt Zeitstempel aus dem vorhandenen Modell entfernen möchten, fügen Sie diese in Ihr Modell ein:

public $timestamps = false;

Erstellen Sie auch eine Migration mit folgendem Code in der up()Methode und führen Sie sie aus:

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

Sie können $table->timestamps()in Ihrer down()Methode verwenden, um ein Rollback zu ermöglichen.

Echtes Spiel
quelle
1
Dies sollte die beste Antwort sein. Wenn Sie über eine vorhandene Produktionsdatenbank verfügen, müssen Sie eine Migration ausführen und Zeitstempel für das Modell deaktivieren.
Brad
6

publicDeklarieren Sie einfach die Zeitstempelvariable in Ihrem Modelto falseund alles wird großartig funktionieren.

public $timestamps = false;

Shahrukh Anwar
quelle
5

Fügen Sie diese Zeile Ihrem Modell hinzu:

Überschreiben Sie die vorhandene Variable $timestamps true in false

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

public $timestamps = false;
Jignesh Joisar
quelle
1

Überschreiben Sie die Funktionen setUpdatedAt()und getUpdatedAtColumn()in Ihrem Modell

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}
Krishan
quelle
20
Ein Fall von "es funktioniert, aber niemand, der
Developerbmw
1

Sie können Zeitstempel vorübergehend deaktivieren

$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
quelle