web-dev-qa-db-fra.com

Laravel - Erreur d'exception d'affectation de masse

J'essaie d'enregistrer plusieurs lignes dans une table, cependant, on me présente un Mass Assignment Error.

L'erreur est: Illuminate \ Database \ Eloquent \ MassAssignmentException criteria_id

$criteria->save();

    $criteria_id = $criteria->id;

     foreach(Input::get('bedrooms') as $bedroom){
        $new_bedroom=array(
            'criteria_id' => $criteria->id,
            'bedroom' => $bedroom,
            );
        $bedroom = new Bedroom($new_bedroom);
        $bedroom->save();
    }

Ma structure de base de données est:

screenshot

il n'y a donc pas d'orthographe incorrecte. Le critère_id provient de la variable des critères récemment enregistrés (voir le code ci-dessus pour la boucle).

Toute aide serait grandement appréciée.

16
user860511

Pour pouvoir définir des propriétés en les passant au constructeur du modèle, vous devez répertorier toutes les propriétés dont vous avez besoin dans le $fillable tableau. Comme mentionné dans le Docs

class Bedroom extends Eloquent {
    protected $fillable = array('criteria_id', 'bedroom');
}

Vous pouvez également utiliser la méthode create si vous le souhaitez. Il crée un nouveau modèle et l'enregistre directement:

foreach(Input::get('bedrooms') as $bedroom){
    $new_bedroom=array(
        'criteria_id' => $criteria->id,
        'bedroom' => $bedroom,
        );
    $bedroom = Bedroom::create($new_bedroom);
}
39
lukasgeiter

Le inverse de ce que lukas a dit est "gardé". Au lieu de "liste blanche", vous pouvez simplement déclarer ceux qui sont protégés.

Par exemple:

class Bedroom extends Model
{
    protected $guarded = ['id'];
}

C'était plus utile pour moi parce que je ne me souciais pas vraiment de la plupart des domaines.

Obtenu à partir des documents pour Laravel 5.2 mais je suppose que cela fonctionne sur les anciennes versions.

Pour autoriser tous les champs, vous pouvez simplement fournir un tableau vide:

class Bedroom extends Model
{
    protected $guarded = [];
}
14
csga5000