2017-05-18 7 views
0

mySQL Datumsformat ist Y-m-d Zur Lokalisierung Gründen Benutzer Datumsfelder meiner Laravel 5.4 Anwendung in der d-m-Y Form einreichen, die gespeichert werden - Mutator aber Datumsfeld nicht in Insert-Anweisung mutiert ausführen zu einem detenutodal Feld in mySQL.Fehler bei Eloquent Modellherstellung - Laravel 5.4

Ich verwendete Mutatoren, um die beiden Formate zu konvertieren, in meinem Attore Modell, so.

<?php 
namespace App; 

//use Illuminate\Database\Eloquent\Model; 
use Carbon\Carbon; 

class Attore extends Model 
{ 

    protected $dates = [ 
     'created_at', 
     'updated_at', 
     'deleted_at', 
     'detenutodal' 
    ]; 

    /** 
    * detenutodal: DB Y-m-d => m-d-Y 
    * 
    * @param date $value 
    * @return date 
    */ 
    public function getDetenutodalAttribute($value) 
    { 
     return Carbon::parse($value)->format('d-m-Y'); 
    } 

    /** 
    * detenutodal: m-d-Y => DB Y-m-d 
    * 
    * @param date $value 
    * @return date 
    */ 
    public function setDetenutodalAttribute($value) 
    { 
     return Carbon::parse($value)->format('Y-m-d'); 
    } 
} 

wie Sie sehen können, das detenutodal Attribut auf den $dates hinzugefügt wird es in eine Carbon Instanz zu machen (nicht erklären, es keinen Unterschied zu machen scheint. Eigentlich war ich nicht in der Lage detenutodal verhalten sich wie ein Carbon-Instanz haben, und ich hatte ausdrücklich Carbon::parse zu nennen)

ich erstelle ein neues Attore Modell in AttoreController wie folgt aus:

$this->validate(request(), [ 
    'detenutodal' =>'nullable|date_format:"d-m-Y"', 
    ]); 

Attore::create(request()->all()); 

Das Detenutodal-Feld ist korrekt validiert, und ich bin sicher, dass der Mutator als I aufgerufen wird. der korrekte detenutodal Wert wird an ihn übergeben - z. 30-06-1943 und es gibt 1943-06-30 zurück.

aber die create nicht mit diesem Fehler:

SQLSTATE[HY000]: General error: 1364 Field 'detenutodal' doesn't have a default value (SQL: insert into `attores` (`nome`, `enteopersona`, `paternita`, `maternita`, `annonascita`, `luogonascita`, `residenza`, `professione`, `gradoistruzione`, `updated_at`, `created_at`) values (Aminto Pestalozzi, persona, Agenore Pestalozzi, Giacinta Tortelazzi, 1910, Caorso in Strà' lva', Via Morigi 4, Caorso, Bracciante, Scuola professionale, 2017-05-18 14:23:22, 2017-05-18 14:23:22)) 

Wie Sie sehen können, klagt mySQL, dass detenutodal keinen Standardwert als detenutodal hat aus der Abfrage vollständig verschwunden, während ich erwarten würde, dass der Mutator korrekt aktualisiert das Feld vor dem Aufruf von Attore::create und fügte es der Abfrage hinzu.

Kann jemand etwas Licht abwerfen?

Dank

Antwort

0

Bearbeiten: Ihr Mutator ist falsch.

public function setDetenutodalAttribute($value) 
{ 
    $this->attributes['detenutodal'] = Carbon::parse($value)->format('Y-m-d'); 
} 

Sie müssen die ausfüllbare Eigenschaft festlegen.

protected $fillable = ['detenutodal']; 

oder stellen Sie den bewachten so

protected $guarded = []; 

Sie Nullable-Wert für das Datum ermöglichen, ist dieses Feld NULL-Werte zulässt?

+0

dieses ' $ this-> Attribute [ 'detenutodal'] ' die Lösung war. war auf der Suche nach dem Problem an einem falschen Ort und nicht in einem schlechten Copypaste Fehler .... danke – RedSash

0

detenutodal Feld ist null und hat Datetime-Wert ist oder nicht nicht Standardwert in mysql Motor bitte zuerst von Controller-Dump Ihres detenutodal Feldes beginnen zu prüfen, ob es einen Wert hat oder nicht, dann prüfen Sie, ob Wert.

+0

es einen Wert hat, ist es die Validierung durchkommt und wird mutiert, aber es ist nicht in der Abfrage enthalten Bekommt klar zu sein, ein paar Debug-Zeilen wie diese hinzu: public function setDetenutodalAttribute ($ value) { echo $ value; Echo '
'; dd (Kohlenstoff :: Parse ($ Wert) -> Format ('Y-m-d')); mit einer Eingabe von Form 30-06-1943 bekomme ich diese Ausgabe 30-06-1943 "1943.06.30" So der Validator übergibt, und der Mutator genannt wird. Aber dann wird der Wert für die Einfügung nicht berücksichtigt. – RedSash

0

Sie haben das Feld detenutodal nicht explizit zulassen, dass es "gefüllt" ist.

Laravel hat einen Sicherheitsmechanismus standardmäßig gegen Mass Assignment

Dies sollte es beheben.

protected $fillable = ['detenutodal']; 
+0

Ich hatte die $ geschützten Attribute in der Superklasse von Attore deklariert. 'Klasse Modell erweitert Eloquent { // geschützt bewacht $ = [ \t \t \t \t 'id', \t \t \t \t 'created_at', \t \t \t \t 'updated_at', \t \t \t \t "deleted_at", \t \t \t]; } ' Ohne die Mutatoren, Insertion arbeitet – RedSash

Verwandte Themen