2014-11-03 15 views
11

Próbuję zapisać wiele wierszy w tabeli, jednak otrzymałem Mass Assignment Error.Laravel - Błąd wyjątku Mass Assignment

Błąd jest: 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(); 
    } 

Moja struktura bazy danych:

screenshot

więc nie ma żadnego błędna pisownia. Parametr kryteria_id pochodzi od zmiennej z ostatnio zapisanych kryteriów (patrz kod powyżej forloop).

Każda pomoc zostanie bardzo doceniona.

+1

Czy 'criteria_id' w' $ fillable' tablicy modelu? – lukasgeiter

+0

@lukasgeiter, nie, nie jest. Tablica jest pusta. Mam później dostęp do zmiennej w kodzie, który działa idealnie dobrze, czyli w pętli foreach. - '-> attach ($ criteria_id)'. – Ben

Odpowiedz

33

Aby móc ustawić właściwości, przekazując je do konstruktora modelu, należy wyświetlić wszystkie potrzebne właściwości w tablicy $fillable. Jak wspomniano w Docs

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

Ponadto można użyć metody create jeśli chcesz. Tworzy nowy model i zapisuje je bezpośrednio:

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

nigdy nie znał wymowy jak rubin na szynach 'attr_accessible' –

9

odwrotny co powiedział Lukas jest „chroniony”. Zamiast pól "white-listing" możesz po prostu zadeklarować, które strzeżone.

Na przykład:

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

To było bardziej użyteczne dla mnie, bo nie troszczą się o większości dziedzin.

Dostałem z dokumentacji dla Laravel 5.2, ale zakładam, że działa na starszych wersjach.

Aby umożliwić wszelkie pola, może po prostu zapewnić pustą tablicę:

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