Comment utiliser uniquement created_at dans Laravel
Je veux seulement utiliser created_at , comment faire?
Je sais:
Cela peut personnalisé horodateurs nom
const CREATED_AT = 'created';
const UPDATED_AT = 'updated';
Cela peut désactiver les horodatages
public $timestamps = false;
Vous devez vous connecter pour publier un commentaire.
Éloquent ne fournit pas cette fonctionnalité de la boîte, mais vous pouvez en créer un sur votre propre en utilisant le
creating
de rappel d'événement:parent::boot();
doit d'abord être appelé.$model->setCreatedAt($model->freshTimestamp());
qui va utiliser lestatic::CREATED_AT
constconst UPDATED_AT = null;
en haut de votre modèle de classe comme dit ci-dessous les réponses!$table->timestamp('created_at')->useCurrent();
dans votre migration.Utiliser le haut:
Et pour "created_at' champ, vous pouvez utiliser:
MISE À JOUR POUR LARAVEL 5.5.0 - 5.5.5
C'était cassé dans Laravel 5.5.0 (et fixe à nouveau dans 5.5.5).
Si vous utilisez 5.5.x, assurez-vous que vous êtes sur la version la plus récente.
Si pour quelque raison vous ne pouvez pas être sur la nouvelle version, voici une solution de contournement.
Définir le public $horodatages pour de faux:
Et si nécessaire:
OU
Lorsque les deux champs "created_at" et "updated_at" sont requis, vous n'avez pas à faire quoi que ce soit, bien sûr 😉
const UPDATED_AT = null;
cesse de Laravel essayer de mettre à jour le updated_at champ dans une table.if (! is_null(static::UPDATED_AT) &&
bien, il/elle a raison à propos de l'aide de la source, mais il/elle n'est pas politiquement correct d'appeler les noms de personnes.J'ai une meilleure réponse de ici pour Laravel 5.2 ou supérieur.
U peut utiliser ce modèle-
Donc, pour votre question, la réponse est -
Column not found: 1054 Unknown column 'updated_at' in 'field list'
Ma solution:
Cela fonctionne pour moi
Carbon::setTestNow($now);
$table->timestamp('created_at')->useCurrent();
J'ai résolu en ajoutant de la valeur par défaut
CURRENT_TIMESTAMP
dans ma base de données pour la colonnecreated_at
. Et Dans mon modèle j'ai utiliser ce code ci-dessousJ'espère que cette méthode fonctionne dans toutes les versions de laravel.
Pour désactiver uniquement updated_at, vous pouvez remplacer le Modèle::setUpdatedAt() la méthode, comme suit :
Bien sûr, si vous voulez faire cela pour la colonne created_at, il est tout aussi facile. Et que de travail pour Laravel 5.1
return Arr::add($values, $column, $this->model->freshTimestampString());
function setUpdatedAtAttribute($value)
CMIIWconst UPDATED_AT = null;
Dans la version 5.3 j'ai juste fait
public $timestamps = false;
et ensuite ajouté protected $version = ['created_at']. Remarque: Vous pouvez ajouter ce que vous voulez, assurez-vous qu'il correspond à celle de votre table.`Approche avec seulement
setUpdatedAt
ne fonctionne pas avec Laravel 5.1.7 parce qu'il a encore un endroit oùupdated_at
transformés.Modèle de classe performUpdate appels à la méthode Constructeur de la classe de la méthode:
qui nous conduit à
Je ne suis pas sûr, pourquoi Laravel est en cours de traitement updated_at deux
performUpdate
avec$this->updateTimestamps()
et puis plus tard dans Builder avec$this->addUpdatedAtColumn($values)
.Avec un peu de débogage, j'ai trouvé que vous devez également mettre à jour votre modèle avec getUpdatedAtColumn remplacer. Au début, j'avais peur qu'il va essayer de mettre à jour un champ inexistant "null", mais il s'est avéré que
Arr::add
est assez intelligent pour ignorer les clés null.Donc, dans votre modèle de classe d'ajouter:
Cela devrait être suffisant pour désactiver les mises à jour.
null
:public function getDates() { $defaults = [static::CREATED_AT]; return $this->timestamps ? array_merge($this->dates, $defaults) : $this->dates; }
Utiliser sur le dessus de la classe:
const UPDATED_AT = null;
ou
const CREATED_AT = null;
Sur votre
model
ensembleconst UPDATED_AT = null;
ou
const CREATED_AT = null;
il s'arrête Laravel essayer de mettre à jour le updated_at/champ created_at
Il travaille pour Laravel 5.8
Et il est préférable de le remplacer:
setUpdatedAt
dans votremodel
car il est plus court et parce que la case à cocher pour
if (! is_null(static::UPDATED_AT)
qui se passe dans le code source, plus tôt que de déclenchementsetUpdatedAt
Ma solution pour cela est d'utiliser un nouveau
__construct
méthode.Voir:
Une solution qui est simple, découplé, et réutilisable à l'utilisation d'un Modèle de l'Observateur. L'idée est de capturer le
creating
de l'événement et de remplir lecreated_at
attribut. Cette méthode peut être utilisée par un certain nombre de modèles sans avoir à répéter de code ou de l'utilisation non officiel des tours. Plus important encore, il ressemble étroitement à la mécanique interne de la classe du Modèle, évitant ainsi des erreurs inattendues.1) Créer
SetCreatedAt
observateur dansApp\Observers
:2) Sur
App\Providers\AppServiceProvider
à l'intérieur de laboot
méthode ajouter la ligne suivante pour chacun des modèles que vous souhaitez lecreated_at
être générée pour:3) Sur vos modèles, la seule chose que vous avez à faire est de désactiver l'horodatage:
Testé avec Laravel 5.3, mais il devrait fonctionner avec les versions précédentes ainsi.
Bonne chance!
YourModel::observe(SetCreatedAt::class)
ligne pour chacun de vos modèles. Je l'ai écrit plus tutoriel détaillé ici arianacosta.com/php/laravel/...En 5.4, le problème qu'il donne, c'est qu'il n'a pas également remplir updated_at champ, même après la mise à jour (Éloquent de mise à jour).
au lieu d'ajouter cette méthode
Pour Laravel 5.*
Modèle:
Migration:
Vous pouvez utiliser CURRENT_TIMESTAMP valeur par défaut pour
created
champ dans votre table MySQL et définirdans votre modèle.
Dans Laravel 5.7, c'était assez pour moi de le faire travailler:
En matière de migrations:
au lieu de classique
$table->timestamp('created_at');
Dans le modèle:
J'ai utilisé très simple hack 😉
class Maclasse extends Modèle {
}
Je viens de le souligner à la fois à la même colonne 🙂