Laravel проект, хранящий данные в базе данных, не работает

У меня есть проект laravel, который использует базу данных mysql с несколькими таблицами. Начнем с того, что покажу вам все мои используемые файлы. Моя проблема в том, что когда я пытаюсь создать Conseillere в базе данных, я получаю ошибку:

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

Плюс я не знаю, действительно ли то, что я сделал, сохранило это должным образом в базе данных. В основном, у модели consillere есть только 2 даты, но также есть nom, prenom, adresse и adresse_courriel. Nom и Prenom находятся в другой таблице с именем Personne.Adresse и ville находятся в другой таблице с именем Adresse. Adresse_courriel находится в другой таблице с именем Courriel. Conseillere имеет все эти атрибуты, но они упоминаются / содержатся в других таблицах / моделях. Модель Conseillere содержит только столбцы date_anniversaire и date_entree. Conseillere — это Personne. Я собираюсь включить некоторые файлы, которые необходимы, но я не уверен, что потребуется больше, чтобы помочь решить мою проблему.

Сначала функция usercontroller, которая сохраняет Conseillere в базе данных:

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:

    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:

<?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'
];
}

}

Модель персонажа:

<?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');
}

}

Миграции 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');

});
}

Миграции персонала:

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

Я искал некоторое время и не могу понять, почему функция хранилища не работает и не сохраняется в БД.

0

Решение

Вот строка, которая выдает ошибку, которую вы цитируете:

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

create метод создает и сохраняет запись немедленно. Он принимает массив данных field => value, но вы передаете пустой массив, поэтому он пытается вставить пустую запись в БД.

Исходя из вашего кода, я думаю, что вы пытаетесь создать новый экземпляр модели Conseillere, установить атрибуты, а затем сохранить его. Если это так, измените эту строку на:

$conseillere = new Conseillere;

А потом, после того, как вы установите обязательные атрибуты:

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

ОБНОВИТЬ

Обратите внимание, что я думаю, что у вас возникнут дополнительные проблемы, так как ваша миграция показывает, что запись в conseilleres имеет внешний ключ personne_id, Так что, возможно, вы пытаетесь создать свой Personneи сохранить его вместе с Conseillere? Если да, вам нужно внести несколько изменений.

Во-первых, AFAICT ваш Conseillere <-> Personne отношения не определены правильно. Ваш Conseillere модель показывает:

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

Но почему бы Conseillere быть связанным с собой? Разве это не должно быть personne?

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

Вам также нужно будет добавить обратное отношение к вашему Personne модель, я не вижу в вашем коде.

Далее вам нужно сохранить оба Personneи связанные Conseillere, Вы можете сделать это как описано в документации:

// 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

Другие решения

Если вы четко понимаете вашу проблему или используете laravel 5.4 или 5.5 … Вам нужно открыть конфиг / database.php здесь вам нужно изменить значение строгий ложно. Что-то вроде этого:-

'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,
],

Надеюсь, поможет!

0

По вопросам рекламы [email protected]