web-dev-qa-db-fra.com

comment n'utiliser que created_at dans laravel

toutes les personnes.

Je suis nouveau à Laravel.

ce sont mes questions:

cela peut nommer des horodatages personnalisés

const CREATED_AT = 'created';
const UPDATED_AT = 'updated';

cela peut désactiver les horodatages

public $timestamps = false;

Je veux seulement utiliser created_at, comment le faire?

39
refear99

Eloquent ne fournit pas de telles fonctionnalités prêtes à l'emploi, mais vous pouvez les créer vous-même en utilisant le rappel d'événement creating:

class User extends Eloquent {

    public $timestamps = false;

    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->created_at = $model->freshTimestamp();
        });
    }

}
66
Joseph Silber

Utilisez sur le dessus:

const UPDATED_AT = null;

Et pour le champ 'created_at', vous pouvez utiliser:

const CREATED_AT = null;

MISE À JOUR POUR LARAVEL 5.5.0 - 5.5.5

Ceci a été cassé dans Laravel 5.5.0 (et corrigé à nouveau dans 5.5.5 ).

Si vous utilisez 5.5.x, assurez-vous d'être sur la version la plus récente.

Si, pour une raison quelconque, vous ne pouvez pas utiliser la version la plus récente, voici une solution de contournement.

Définissez public $ timestamps sur false:

public $timestamps = false;

Et si nécessaire:

public function setCreatedAtAttribute($value) { 
    $this->attributes['created_at'] = \Carbon\Carbon::now(); 
}

OR

public function setUpdatedAtAttribute($value) { 
    $this->attributes['updated_at'] = \Carbon\Carbon::now(); 
}

Lorsque les deux champs "created_at" et "updated_at" sont obligatoires, vous n'avez rien à faire, bien sûr;)

J'ai une meilleure réponse de ici pour Laravel 5.2 ou supérieur .

U peut l'utiliser dans la modélisation

class User extends Model
{
    public $timestamps = false; // disable all behaviour
    public $timestamps = true; // enable all behaviour
    public $timestamps = [ "created_at" ]; // enable only to created_at
    public $timestamps = [ "updated_at" ]; // enable only to updated_at
    public $timestamps = [ "created_at", "updated_at" ]; // same that true
}

Donc, pour votre question, la réponse est -

public $timestamps = [ "created_at" ]; // enable only to created_at
17
Abrar Jahin

Ma solution:

class CreatePostsTable extends Migration {

   public function up() {

      Schema::create('posts', function(Blueprint $table){

         $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
   });
}

Ça marche pour moi

13
Dan

J'ai résolu en ajoutant la valeur par défaut CURRENT_TIMESTAMP dans ma base de données pour la colonne created_at. Et dans mon modèle, j'utilise ce code ci-dessous

public $timestamps = false;
protected $dates = ['created_at'];

J'espère que cette méthode fonctionne dans toutes les versions de Laravel.

4
sathish R

Dans la version 5.3, je viens de faire public $timestamps = false; puis d'ajouter protected $ fillable = ['created_at']. Remarque: vous pouvez ajouter ce que vous voulez, assurez-vous qu'il correspond à celui de votre table. 

3
m0rPh1n3

Pour désactiver uniquement updated_at, vous pouvez remplacer la méthode Model :: setUpdatedAt (), comme suit: 

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

Bien sûr, si vous voulez faire cela pour la colonne created_at, c'est tout aussi simple. Et c'est un travail pour Laravel 5.1

2
absolux

L'approche avec seulement setUpdatedAt ne fonctionnait pas avec Laravel 5.1.7 car il existe un emplacement supplémentaire où updated_at est traité.

Appels de méthode performUpdate de classe de modèle Méthode de classe Builder:

public function update(array $values)
{
    return $this->query->update($this->addUpdatedAtColumn($values));
}

ce qui nous amène à

return Arr::add($values, $column, $this->model->freshTimestampString());

Je ne suis pas sûr de savoir pourquoi Laravel traite updated_at deux fois - dans performUpdate avec $this->updateTimestamps(), puis plus tard dans Builder avec $this->addUpdatedAtColumn($values).

Avec un peu de débogage, j'ai constaté que vous deviez également mettre à jour votre modèle avec le remplacement de getUpdatedAtColumn. Au début, j’avais peur qu’il essaye de mettre à jour un champ inexistant "null", mais il s’est avéré que Arr::add est assez intelligent pour ignorer les clés nulles.

Alors, dans votre classe de modèle, ajoutez ceci:

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

public function getUpdatedAtColumn()
{
    return null;
}

Cela devrait suffire à désactiver les deux mises à jour.

2
JustAMartin

Ma solution consiste à utiliser une nouvelle méthode __construct.

Voir:

class MyModel extends Eloquent {

    public $timestamps = false;

    public function __construct(array $attributes = [])
    {
            parent::__construct($attributes);

            $this->attributes['created_at'] = $this->freshTimestamp();
    }
}
1
Wallace Maxters

Une solution simple, découplée et réutilisable consiste à utiliser un observateur de modèle. L'idée est de capturer l'événement creating et de renseigner l'attribut created_at. Cette méthode peut être utilisée par un nombre quelconque de modèles sans avoir à répéter le code ni à utiliser des astuces non officielles. Plus important encore, il ressemble beaucoup à la mécanique interne de la classe Model, évitant ainsi des erreurs inattendues.

1) Créez SetCreatedAt observateur dans App\Observers:

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;

class SetCreatedAt
{
    /**
     * Sets created_at when creating the model.
     *
     * @param Model $model
     * @return void
     */
    public function creating(Model $model)
    {
        $model->setCreatedAt($model->freshTimestamp());
    }
}

2) Sur App\Providers\AppServiceProvider dans la méthode boot, ajoutez la ligne suivante pour chacun des modèles pour lesquels vous souhaitez générer le created_at:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    // Replace OrderLog with your model
    OrderLog::observe(SetCreatedAt::class);
}

3) Sur vos modèles, la seule chose à faire est de désactiver les horodatages:

// Disable timestamps on the model
public $timestamps = false;

Testé avec Laravel 5.3, mais il devrait également fonctionner avec les versions précédentes.

Bonne chance!

1
Arian Acosta

Vous pouvez utiliser la valeur par défaut CURRENT_TIMESTAMP pour le champ created dans votre table MySQL et définir 

public $timestamps = false;

dans votre modèle.

0
Leonid Serdiuk

Pour Laravel 5. *

Modèle:

//  Disable updated_at (only created_at)
class Book extends Model
{
     const UPDATED_AT = null;

     /* ... */
}

Migration:

Schema::create('books', function (Blueprint $table): void {
    /* ... */
    $table->timestampTz('created_at')->nullable();
});
0
pablorsk

En 5.4, le problème qu'il pose est qu'il ne remplit pas non plus le champ updated_at même après la mise à jour (mise à jour Eloquent).

au lieu d'ajouter cette méthode

public function setUpdatedAtAttribute($value)
{
    // auto disable update_at in inserts
}
0
Vandolph Reyes

Utilisez en haut de la classe:

const UPDATED_AT = null;

ou

const CREATED_AT = null;

0
user3213674

Dans Laravel 5.7 , cela me suffisait pour que cela fonctionne:

En migration:

$table->timestamp('created_at')->nullable();

au lieu de $table->timestamp('created_at'); classique

Dans le modèle:

const UPDATED_AT = null;
0
Ivan Loler

Sur votre model set

const UPDATED_AT = null;

ou

const CREATED_AT = null;

il arrête Laravel essayer de mettre à jour le champ updated_at/created_at

Cela fonctionne pour Laravel 5.8

Et il vaut mieux que d’écraser: setUpdatedAt dans votre model

public function setUpdatedAt($value) : self 
{
    // Do nothing.
    return $this;
}

car il est plus court et que la vérification de if (! is_null(static::UPDATED_AT) intervient dans le code source plus tôt que le déclenchement de setUpdatedAt

0