Ich bin ein Laravel-Neuling. Ich möchte meine Datenbank setzen. Wenn ich den Befehl seed ausführe, wird eine Ausnahme angezeigt
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Was mache ich falsch. Der Befehl, den ich benutze, ist:
php artisan db:seed --class="UsersTableSeeder"
Meine Samenklasse ist wie folgt:
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
und meine Antwort eine gute generische Lösung ist, werde ich sie so lassen, wie sie ist.Ich benutze Laravel 4.2.
der Fehler, den Sie sehen
Dies liegt in der Tat daran, dass die Datenbank vor massenhaftem Füllen geschützt ist, was Sie tun, wenn Sie einen Seeder ausführen. Meiner Meinung nach ist es jedoch nicht erforderlich (und möglicherweise unsicher) anzugeben, welche Felder in Ihrem Modell ausgefüllt werden sollen, wenn Sie nur einen Seeder ausführen müssen.
In Ihrem Seeding-Ordner befindet sich die DatabaseSeeder-Klasse:
Diese Klasse fungiert als Fassade und listet alle Sämaschinen auf, die ausgeführt werden müssen. Wenn Sie den UsersTableSeeder-Seeder manuell über artisan aufrufen, wie Sie es mit dem
php artisan db:seed --class="UsersTableSeeder"
Befehl getan haben , umgehen Sie diese DatabaseSeeder-Klasse.In dieser DatabaseSeeder-Klasse ermöglicht der Befehl
Eloquent::unguard();
die temporäre Massenzuweisung für alle Tabellen. Dies ist genau das, was Sie beim Seeding einer Datenbank benötigen. Diese unguard-Methode wird nur ausgeführt, wenn Sie die ausführenphp aristan db:seed
Befehl ist daher nur vorübergehend, die Felder in Ihrem Modell ausfüllbar zu machen (wie in den akzeptierten und anderen Antworten angegeben).Sie müssen lediglich die
$this->call('UsersTableSeeder');
Ausführungsmethode in der DatabaseSeeder-Klasse hinzufügen undphp aristan db:seed
in Ihrer CLI ausführen, die standardmäßig DatabaseSeeder ausführt.Beachten Sie auch, dass Sie einen Plural-Klassennamen Benutzer verwenden, während Laraval die Singularform Benutzer verwendet. Wenn Sie Ihre Klasse in die herkömmliche Singularform ändern möchten, können Sie einfach
//$this->call('UserTableSeeder');
die bereits zugewiesene, aber standardmäßig auskommentierte Klasse in der DatabaseSeeder-Klasse auskommentieren.quelle
\Eloquent::reguard();
, denn nachdem Ihre Massenaufgaben abgeschlossen sind.Um alle Felder ausfüllbar zu machen , deklarieren Sie einfach Ihre Klasse:
Auf diese Weise können Sie die Füllmethode aufrufen, ohne jedes Feld zu deklarieren.
quelle
Fügen Sie einfach
Eloquent::unguard();
oben in der Ausführungsmethode hinzu, wenn Sie einen Startwert erstellen. Sie müssen nicht$fillable
in allen Modellen, die Sie festlegen müssen, ein Array erstellen .Normalerweise ist dies bereits in der
DatabaseSeeder
Klasse angegeben. Da Sie jedochUsersTableSeeder
direkt anrufen :php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
wird nicht aufgerufen und gibt den Fehler aus.quelle
Ich habe das benutzt und habe kein Problem:
quelle
Ich habe die MassAssignmentException erhalten, als ich mein Modell so erweitert habe.
Ich habe versucht, ein Array wie dieses einzufügen
Das Problem wurde behoben, als ich das Upload-Modell als erstellt habe
Referenz https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
quelle
Benutzereigenes Modell in Ihrer Controller-Datei.
quelle
Wenn Sie Tabellen und Felder in der Datenbank haben, können Sie einfach diesen Befehl verwenden:
quelle
Dies ist kein guter Weg, wenn Sie eine Datenbank erstellen möchten.
Verwenden Sie Fälscher anstelle von Hardcodierung, und vor all dem ist es vielleicht besser, Tabellen abzuschneiden.
Betrachten Sie dieses Beispiel:
quelle
Verwenden Sie die Fülldatei , um Laravel mitzuteilen, welche Felder mit einem Array gefüllt werden können. Standardmäßig erlaubt Laravel nicht, dass Datenbankfelder über ein Array aktualisiert werden
Das Gegenteil von befüllbar ist guardable .
quelle
Wenn Sie die OOP-Einfügemethode verwenden, müssen Sie sich keine Gedanken über Massenaktionen / füllbare Eigenschaften machen:
quelle