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?
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();
});
}
}
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
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
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.
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.
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
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.
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();
}
}
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!
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.
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();
});
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
}
Utilisez en haut de la classe:
const UPDATED_AT = null;
ou
const CREATED_AT = null;
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;
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