0

我有一个 laravel 项目,它使用带有几个表的 mysql 数据库。让我们首先向您展示我正在使用的所有文件。我的问题是,当我尝试在数据库中创建“Conseillere”时,出现错误:

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

另外,我不知道我所做的是否真的将其正确保存在数据库中。基本上,conseillere 模型只有 2 个日期,但也有 nom、prenom、adresse 和 adresse_courriel。Nom 和 Prenom 位于另一个名为 Personne.Adresse 的表中,而 ville 位于另一个名为 Adresse 的表中。Adresse_courriel 位于另一个名为 Courriel 的表中。Conseillere 具有所有这些属性,但它们在其他表/模型中被引用/包含。Conseillere 模型仅包含 date_anniversaire 和 date_entree 列。Conseillere 是一个 Personne。我将包含一些需要的文件,但我不确定它是否需要更多来帮助解决我的问题。

首先是将 Conseillere 存储到数据库中的 usercontroller 函数:

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());
    }




}

构造日期函数:

    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";
    }
}

}

康赛耶模型:

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

我已经搜索了一段时间,无法弄清楚为什么存储功能不起作用并且没有保存到数据库中。

4

2 回答 2

0

如果清楚地了解您的问题,或者您使用的是 laravel 5.4 或 5.5... 您需要在此处打开config/database.php您需要将strict的值更改为 false。像这样的东西:-

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

希望能帮助到你!

于 2017-12-06T04:14:32.733 回答
0

这是引发您引用的错误的行:

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

create方法立即创建并保存记录。它接受一个字段 => 值数据的数组,但您传入的是一个空数组,因此它试图将一条空白记录插入数据库。

按照您的代码,我认为您正在尝试创建一个新的 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);
于 2017-12-06T01:10:52.460 回答