web-dev-qa-db-fra.com

Le champ Laravel 5.4 n'a pas de valeur par défaut

Je rencontre cette erreur et aucun des résultats de Google que j'ai vérifiés ne ressemble à mon problème.

J'ai une application avec la classe Deal, User et Matches

Un accord a plusieurs correspondances . Un utilisateur a plusieurs correspondances . Un utilisateur a plusieurs offres.

J'essaie de créer un nouveau match en utilisant mon objet Deal

$deal->matches()->create(['user_id'=>$id]);

Ceci est ma classe de correspondance, j'ai défini toutes les relations nécessaires

class Match extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];
    public $timestamps = false;
    public $expired_on = "";


    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->matched_on = $model->freshTimestamp();
        });
    }

    public function __construct(){
        $d = (new \DateTime($this->matched_on))->modify('+1 day');
        $this->expired_on = $d->format('Y-m-d H:i:s');
    }


    /**
     * Get the user that owns the match.
     */
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    /**
     * Get the deal that owns the match.
     */
    public function deal()
    {
        return $this->belongsTo('App\Deal');
    }
}

Et je continue à avoir cette erreur lorsque je tente de créer un nouveau match.

QueryException dans Connection.php, ligne 647: SQLSTATE [HY000]: Erreur générale: 1364 Le champ 'ID_utilisateur' n'a pas de valeur par défaut (SQL: insérer dans matches (deal_id) valeurs (1))

J'ai ma garde d'être un tableau vide, quel pourrait être le problème?

13
John David

Supprimez le tableau guarded et ajoutez plutôt la fillable:

protected $fillable = ['user_id', 'deal_id'];
31
Alexey Mezenin

Si vous souhaitez revenir au comportement précédent, mettez à jour votre

config/database.php

fichier et définissez 'strict' => false pour votre connexion.

20
grantDEV

Alexey Mezenin La réponse est correcte et bonne.

Une autre façon de l'utiliser, pour ceux qui souhaitent conserver le tableau vide gardé, est de créer un nouvel objet Match, d'y insérer les attributs et de le sauvegarder.

            $match->user_id = $id;
            $match->deal_id = $deal->id;
            $match->matched_on = $match->freshTimestamp();
            $match->save();
3
John David

Comme c'était un champ unique dans mon cas, je ne pouvais pas le rendre nul.

Pour moi, j'avais un constructeur vide qui était à l'origine du problème, je ne sais pas pourquoi . S'il vous plaît, commentez si quelqu'un en connaît la raison.

public function __construct(){

}

Le commenter/le supprimer a résolu le problème.

0
vivek takrani