user860511
user860511

Reputation:

Laravel - Mass Assignment Exception error

I am trying to save multiple rows to a table, however, I am presented with a Mass Assignment Error.

The error is: 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();
    }

My database structure is:

screenshot

so there isn't any incorrect spelling. The criteria_id comes from the variable from the recently saved criteria (see code above forloop).

Any help would be greatly appreciated.

Upvotes: 17

Views: 31807

Answers (3)

A H T
A H T

Reputation: 1

Write the code in the Model that you want to store your data on that table. Suppose your table is bedrooms and you created model is Bedroom which is located in the app folder.

In your case, you have to store data in $criteria_id and $bedroom, so you should add these two fields to the model in the following way.

class Bedroom extends Model 
{
    protected $fillable = ['criteria_id', 'bedroom'];
}

Upvotes: 0

csga5000
csga5000

Reputation: 4141

The inverse of what lukas said is "guarded". Instead of "white-listing" fields, you could just declare which are guarded.

For example:

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

This was more useful for me because I didn't really care about most fields.

Gotten from the docs for Laravel 5.2 but I assume it works on older versions.

To allow any fields, you could just provide an empty array:

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

Upvotes: 14

lukasgeiter
lukasgeiter

Reputation: 152860

To be able to set properties by passing them to the model's constructor, you need to list all the properties you need in the $fillable array. As mentioned in the Docs

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

Also you can use the create method if you want. It creates a new model and saves it directly:

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

Upvotes: 40

Related Questions