将数据存储在数据库中的laravel项目不起作用

时间:2017-12-06 00:37:42

标签: php database laravel storing-information

我有一个使用带有几个表的mysql数据库的laravel项目。让我们首先向你展示我正在使用的所有文件。我的问题是,当我尝试创建' Conseillere'进入数据库,我得到错误:

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

另外,我不知道我做了什么,真的在数据库中正确保存。基本上,the 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());
    }




}

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

}

Personne模型:

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

    });
}

Personne的迁移:

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

我一直在寻找一段时间而无法解释为什么商店功能无法正常工作而不能保存到数据库中。

2 个答案:

答案 0 :(得分:0)

以下是抛出引用错误的行:

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

The create method立即创建并保存记录。它接受一个field =&gt;数组。值数据,但是您传入一个空数组,因此它尝试将空白记录插入数据库。

按照您的代码,我认为您正在尝试创建一个新的Conseillere模型实例,设置属性,然后保存它。如果是这样,请将该行更改为:

$conseillere = new Conseillere;

然后,在您设置了所需的属性之后:

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

<强>更新

请注意,我认为您将遇到其他问题,因为您的迁移显示conseilleres中的记录有外键personne_id。那么也许您正在尝试创建Personne,并将其与关联的Conseillere一起保存?如果是,您需要进行一些更改。

首先,AFAICT您的Conseillere&lt; - &gt; 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 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);

答案 1 :(得分:0)

如果您清楚地了解您的问题或者您使用的是laravel 5.4或5.5 ...您需要在此处打开 config / 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,
    ],

希望它有所帮助!