Jestem nowicjuszem Laravel. Chcę zasiać moją bazę danych. Kiedy uruchamiam polecenie seed, pojawia się wyjątek
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Co ja robię źle. Polecenie, którego używam, to:
php artisan db:seed --class="UsersTableSeeder"
Moja klasa nasion jest następująca:
class UsersTableSeeder extends Seeder {
public function run()
{
User::truncate();
User::create([
'username' => 'PaulSheer',
'email' => '[email protected]',
'password' => '45678'
]);
User::create([
'username' => 'Stevo',
'email' => '[email protected]',
'password' => '45678'
]);
}
}
MassAssignmentException
i ponieważ wydaje mi się, że moja odpowiedź jest dobrym rozwiązaniem ogólnym, zachowam ją tak, jak jest.Używam Laravel 4.2.
błąd, który widzisz
w rzeczywistości jest tak, ponieważ baza danych jest chroniona przed masowym wypełnianiem, co robisz podczas wykonywania siewnika. Jednak moim zdaniem nie jest konieczne (i może być niebezpieczne) deklarowanie, które pola powinny być wypełnione w twoim modelu, jeśli potrzebujesz tylko wykonać siewnik.
W swoim folderze początkowym masz klasę DatabaseSeeder:
Ta klasa działa jak fasada, wymieniając wszystkie siewniki, które należy wykonać. Jeśli wywołasz siewnik UsersTableSeeder ręcznie przez rzemieślnika, tak jak w przypadku
php artisan db:seed --class="UsersTableSeeder"
polecenia, pominiesz tę klasę DatabaseSeeder.W tej klasie DatabaseSeeder polecenie
Eloquent::unguard();
umożliwia tymczasowe przypisanie masy do wszystkich tabel, co jest dokładnie tym, czego potrzebujesz podczas wypełniania bazy danych. Ta metoda unguard jest wykonywana tylko po uruchomieniuphp aristan db:seed
polecenia, dlatego jest tymczasowa, w przeciwieństwie do umożliwienia wypełniania pól w modelu (jak podano w zaakceptowanych i innych odpowiedziach).Wszystko, co musisz zrobić, to dodać
$this->call('UsersTableSeeder');
do metody run w klasie DatabaseSeeder i uruchomićphp aristan db:seed
w swoim CLI, który domyślnie będzie wykonywał DatabaseSeeder.Zauważ również, że używasz liczby mnogiej Users, podczas gdy Laraval używa liczby pojedynczej User. Jeśli zdecydujesz się zmienić klasę na tradycyjną liczbę pojedynczą, możesz po prostu odkomentować tę,
//$this->call('UserTableSeeder');
która została już przypisana, ale domyślnie zakomentowana w klasie DatabaseSeeder.źródło
\Eloquent::reguard();
, ponieważ po ukończeniu przydziałów masowych.Aby umożliwić wypełnianie wszystkich pól , po prostu zadeklaruj w swojej klasie:
Umożliwi to wywołanie metody fill bez deklarowania każdego pola.
źródło
Po prostu dodaj
Eloquent::unguard();
na początku metody uruchamiania, gdy robisz ziarno, nie ma potrzeby tworzenia$fillable
tablicy we wszystkich modelach, które musisz zasiać.Zwykle jest to już określone w
DatabaseSeeder
klasie. Jednak ponieważ dzwoniszUsersTableSeeder
bezpośrednio:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
nie jest wywoływana i podaje błąd.źródło
Użyłem tego i nie mam problemu:
źródło
Otrzymałem MassAssignmentException, gdy rozszerzyłem mój model w ten sposób.
Próbowałem wstawić tablicę w ten sposób
Problem został rozwiązany, gdy utworzyłem Prześlij model jako
Odniesienie https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
źródło
Właściwy model użytkownika w pliku kontrolera.
źródło
jeśli masz tabelę i pola w bazie danych, możesz po prostu użyć tego polecenia:
źródło
To nie jest dobry sposób, gdy chcesz wypełnić bazę danych.
Użyj fakera zamiast twardego kodowania, a przed tym wszystkim może lepiej skrócić tabele.
Rozważmy ten przykład:
źródło
Użyj napełniane powiedzieć laravel które pola mogą być wypełnione przy użyciu tablicy. Domyślnie Laravel nie pozwala na aktualizację pól bazy danych za pośrednictwem tablicy
Przeciwieństwem można napełniać jest guardable .
źródło
Jeśli używasz metody OOP wstawiania, nie musisz martwić się o właściwości masowe / wypełniane:
źródło