2017-12-06 2 views
0

Ich habe ein Laravel-Projekt, das eine MySQL-Datenbank mit ein paar Tabellen verwendet. Lassen Sie uns beginnen, indem Sie alle meine Dateien, die verwendet werden. Mein Problem ist, dass wenn ich versuche zu erstellen die ‚Conseillere‘ in die Datenbank, erhalte ich Fehler:Laravel Projekt Speichern von Daten in der Datenbank funktioniert nicht

'SQLSTATE[HY000]: General error: 1364 Field 'date_anniversaire' doesn't have a default value (SQL: insert into `conseilleres`() values())' 

plus ich weiß nicht, ob das, was ich wirklich richtig in der Datenbank gespeichert haben. Grundsätzlich hat das consellere Modell nur 2 date, aber auch nom, prenom, adresse und adresse_courriel. Nom und Prenom sind in einer anderen Tabelle namens Personne.Adresse und Ville sind in einer anderen Tabelle namens Adresse.Adresse_courriel ist in einer anderen Tabelle namens Courriel. Conseillere hat all diese Attribute, aber sie sind in anderen Tabellen/Modellen referenziert/enthalten. Das Modell von Conseillere enthält nur date_anniversaire und date_entree column.Conseillere ist eine Personne. Ich werde einige Dateien einschließen, die benötigt werden, aber ich bin nicht sicher, ob es mehr benötigen würde, um mein Problem zu lösen.

Zuerst wird die Usercontroller Funktion, die die Conseillere in der Datenbank speichern:

public function store(){ 

    $input = Input::all(); 
    $unepersonne = Personne::create([]); 
    $uncourriel = new Courriel; 
    $adresse = new Adresse; 
    $conseillere = Conseillere::create([]); 

    $uncourriel->adresse_courriel = $input['adresse_courriel']; 
    $unepersonne->nom = $input['nom']; 
    $unepersonne->prenom = $input['prenom']; 

    $adresse->adresse = $input['adresse']; 
    $adresse->ville = $input['ville']; 

    //the following function are creating drop downs to input a date. for translation purpose, annee=year mois=months and jour=day 
    $conseillere->date_anniversaire = ConseillereController::construire_date($input['annee_anniversaire']-1, $input['mois_anniversaire']-1, $input['jour_anniversaire']-1); 
    $conseillere->date_entree = ConseillereController::construire_date($input['annee_entree']-1, $input['mois_entree']-1, $input['jour_entree']-1); 


    if ($unepersonne->save()){ 


    } else { 

     return Redirect::back()->withInput()->withErrors($conseillere->validationMessages()); 
    } 




} 

construire_date Funktion:

private function construire_date($annee, $mois, $jour) 
{ 
    if (checkdate($mois, $jour, $annee)) { 
     $dateTest = new DateTime; 
     $dateTest->setDate($annee, $mois, $jour); 
     return $dateTest->format('Y-m-d'); 
    } else { 
     return "invalide"; 
    } 
} 

}

Conseillere Modell:

<?php 

namespace App\Models; 

class Conseillere extends EloquentValidating { 
protected $guarded = array('id'); 


public $timestamps = false; 


public function conseillere() { 
    return $this->belongsTo('App\Models\Conseillere'); 
} 



protected $fillable = [ 
     'nom', 
     'prenom', 
     'adresse', 
     'ville', 
     'adresse_courriel', 
     'date_anniversaire', 
     'date_entree' 
    ]; 

/** 
* Validation 
*/ 

public $validationMessages; 

public function validationRules() { 
    return [ 
      'date_anniversaire' => 'nullable|date', 
      'date_entree' => 'nullable|date' 
    ]; 
} 

}

Personne Modell:

<?php 

namespace App\Models; 

class Personne extends EloquentValidating 
{ 

protected $table = 'personnes'; 


public $timestamps = false; 

protected $fillable = [ 

    'nom', 
    'prenom', 
]; 


public $validationMessages; 

public function validationRules() { 
    return 
    [ 
      'personne' => 'required', 
    ]; 
} 


public function utilisateurs(){ 

    return $this->belongsToMany('App\Utilisateur'); 
} 



public function adresse() { 
    return $this->hasMany('App\Models\Adresse'); 
} 


public function carte_credits(){ 

    return $this->belongsToMany('App\Carte_credit'); 
} 

public function courriels(){ 
    return $this->hasMany('App\Models\Courriel'); 
} 

}

Migrationen von Conseillere:

public function up() 
{ 
    Schema::create('conseilleres', function (Blueprint $table) { 

     $table->increments('id'); 
     $table->dateTime('date_anniversaire'); 
     $table->dateTime('date_entree'); 

     $table->integer('personne_id') 
         ->unsigned(); 
     $table->foreign('personne_id') 
         ->references('id') 
         ->on('personnes') 
         ->onDelete('cascade'); 

    }); 
} 

Migrationen von Personne:

public function up() 
{ 
    Schema::create('personnes', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('nom'); 
     $table->string('prenom'); 
     $table->timestamps(); 
    }); 
} 

Ive gesucht für eine Weile und kann nicht verstehen, warum die Speicherfunktion nicht funktioniert und nicht in der Datenbank speichern.

+0

Welche Laravel-Version verwenden Sie? – kunal

Antwort

0

Hier ist die Linie, die den Fehler werfen Sie zitieren:

$conseillere = Conseillere::create([]); 

The create method erstellt und speichert eine sofortige Aufzeichnung. Es akzeptiert ein Array von Feld => Wert Daten, aber Sie übergeben ein leeres Array, so dass es versucht, einen leeren Datensatz in die DB einzufügen.

Gehen Sie mit Ihrem Code, ich denke, Sie versuchen, eine neue Conseillere-Modellinstanz erstellen, Attribute festlegen und speichern Sie es dann.Wenn ja, ändern diese Zeile:

$conseillere = new Conseillere; 

Und später dann, nachdem Sie die erforderlichen Attribute festgelegt haben:

$conseillere->date_entree = ... 
$conseillere->save(); 

UPDATE

Beachten Sie aber, dass ich glaube, du gehst zusätzliche Probleme zu haben, da Ihre Migration zeigt, dass ein Datensatz in conseilleres einen Fremdschlüssel personne_id hat. Also vielleicht versuchen Sie, Ihre Personne zu erstellen, und speichern Sie sie zusammen mit der zugehörigen Conseillere? Wenn ja, müssen Sie einige Änderungen vornehmen.

Erstens, AFAICT Ihre < ->Personne Beziehung ist nicht korrekt definiert. Ihr Conseillere Modell zeigt:

public function conseillere() { 
    return $this->belongsTo('App\Models\Conseillere'); 
} 

Aber warum sollte Conseillere sich zusammenhängen? Sollte das nicht personne sein?

public function personne() { 
    return $this->belongsTo('App\Models\Personne'); 
} 

Sie werden auch die inverse Beziehung auf Ihrem Personne Modell hinzufügen müssen, ich sehe es nicht in Ihrem Code.

Als nächstes müssen Sie sowohl den Personne als auch den zugehörigen Conseillere speichern. Sie können tun, dass as described in the docs:

// As above, change your create call to a simple 'new' 
$conseillere = new Conseillere; 

// ... rest of your code ... 
$conseillere->date_entree = ... 

// Now save the updated personne. This only works bcs 
// when you did $unepersonne = Personne::create([]) it created a 
// blank record in the DB with an id, basically you are doing an 
// update of an existing record here. 
$unepersonne->save(); 

// Now save the related model. 
$unepersonne->conseillere()->save($conseillere); 
+0

Dies ist die Art und Weise, wie ich es vorher gemacht habe, aber diese Methode scheint nicht das ID-Inkrement zu erstellen. Es wird nur erstellt, wenn ich das verursache, was zu Problemen führt. $ $ Conzillere = Conseillere :: create ([]); Es weist ihm eine ID zu. Auch gab es neben der save-Anweisung einen Tippfehler, den ich in der Frage bearbeitet habe. Wenn Sie $ consillere = new Conseillere tun; Ich bekomme keinen Fehler, aber nichts wird in der Datenbank erstellt, was mein zweites Problem ist und ich verstehe nicht warum. –

+0

Es wurde kein Datensatz erstellt, den Sie nie in der Datenbank gespeichert haben. Ich habe meine Antwort aktualisiert. –

+0

Danke. Ich habe versucht, was Sie in Ihrem Update sagten, aber jetzt bekomme ich Fehler Aufruf zu undefinierte Methode Illuminate \ Database \ Query \ Builder :: consellere() –

0

Wenn Ihr Problem klar verstehen, oder wenn Sie mit Laravel 5.4 oder 5.5 ... Sie müssen Config öffnen/database.php hier müssen Sie den Wert von ändern streng zu falsch. Etwas wie dieses: -

'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_HOST', 'localhost'), 
     'port' => env('DB_PORT', '3306'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
     'strict' => false, // replace true to false here 
     'engine' => null, 
    ], 

Hoffnung hilft es!

+0

Warum ist das erforderlich? –

+0

@ Don'tPanic beacuse ich habe das gleiche Problem in Laravel 5.4 Reibe Version hat kein Standardwert Problem, so dass ich auf diese Weise lösen – kunal

+0

ich don ' Ich verstehe, was das bedeutet ... das könnte die Antwort sein, aber Sie werden die Qualität Ihrer Antwort erheblich verbessern, wenn Sie erklären, warum die vorgeschlagene Änderung Ihnen hilft und was genau das tut Code-only-Antworten werden im Allgemeinen als minderwertig angesehen Hier auf SO - erklären * warum *, nicht nur was. –

Verwandte Themen