У меня есть проект 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();
});
}
Я искал некоторое время и не могу понять, почему функция хранилища не работает и не сохраняется в БД.
Вот строка, которая выдает ошибку, которую вы цитируете:
$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);
Если вы четко понимаете вашу проблему или используете 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,
],
Надеюсь, поможет!