Ich lerne gerade Laravel und habe eine funktionierende Migrationsdatei, die eine Benutzertabelle erstellt. Ich versuche, einen Benutzerdatensatz im Rahmen der Migration zu füllen:
public function up()
{
Schema::create('users', function($table){
$table->increments('id');
$table->string('email', 255);
$table->string('password', 64);
$table->boolean('verified');
$table->string('token', 255);
$table->timestamps();
DB::table('users')->insert(
array(
'email' => '[email protected]',
'verified' => true
)
);
});
}
Beim Ausführen wird jedoch der folgende Fehler angezeigt php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Dies liegt offensichtlich daran, dass Artisan die Tabelle noch nicht erstellt hat, aber die gesamte Dokumentation scheint zu sagen, dass es eine Möglichkeit gibt, Fluent Query zum Auffüllen von Daten im Rahmen einer Migration zu verwenden.
Weiß jemand wie? Vielen Dank!
php
laravel
migration
mysql-error-1146
Adam Hopkinson
quelle
quelle
DB::table('users')->insert([ ['email' => '[email protected]', 'votes' => 0], ['email' => '[email protected]', 'votes' => 0] ]);
Ich weiß, dass dies ein alter Beitrag ist, aber da er in einer Google-Suche auftaucht, dachte ich, ich würde hier etwas Wissen teilen. @ erin-geyer wies darauf hin, dass das Mischen von Migrationen und Seedern Kopfschmerzen verursachen kann, und @justamartin konterte, dass manchmal Daten im Rahmen Ihrer Bereitstellung ausgefüllt werden sollen / müssen.
Ich würde noch einen Schritt weiter gehen und sagen, dass es manchmal wünschenswert ist, Datenänderungen konsistent einführen zu können, damit Sie beispielsweise für Staging bereitstellen, sicherstellen können, dass alles in Ordnung ist, und dann mit dem Vertrauen auf dieselben Ergebnisse für die Produktion bereitstellen können (und müssen nicht daran denken, einen manuellen Schritt auszuführen).
Es ist jedoch immer noch sinnvoll, das Saatgut und die Migration zu trennen, da dies zwei verwandte, aber unterschiedliche Anliegen sind. Unser Team hat Kompromisse geschlossen, indem es Migrationen erstellt hat, die Sämaschinen nennen. Das sieht so aus:
Auf diese Weise können Sie einen Startwert wie bei einer Migration einmal ausführen. Sie können auch eine Logik implementieren, die das Verhalten verhindert oder erweitert. Beispielsweise:
Dies würde Ihren Seeder natürlich bedingt ausführen, wenn weniger als 10 SomeModels vorhanden sind. Dies ist nützlich, wenn Sie den Seeder als Standard-Seeder einschließen möchten, der sowohl beim Aufrufen
artisan db:seed
als auch bei der Migration ausgeführt wird, damit Sie nicht "verdoppeln". Sie können auch eine Rückwärtssämaschine erstellen, damit Rollbacks wie erwartet funktionieren, zDer zweite Parameter
--force
ist erforderlich, damit Seeder in einer Produktionsumgebung ausgeführt werden kann.quelle
Hier ist eine sehr gute Erklärung, warum die Verwendung von Laravels Database Seeder der Verwendung von Migrationen vorzuziehen ist: http://laravelbook.com/laravel-database-seeding/
Das Befolgen der Anweisungen in der offiziellen Dokumentation ist jedoch eine viel bessere Idee, da die unter dem obigen Link beschriebene Implementierung nicht zu funktionieren scheint und unvollständig ist. http://laravel.com/docs/migrations#database-seeding
quelle
Dies sollte tun, was Sie wollen.
quelle
Eine andere saubere Möglichkeit besteht darin, eine private Methode zu definieren, mit der eine Instanz erstellt und das betreffende Modell beibehalten wird.
Mit dieser Lösung werden Zeitstempelfelder von Eloquent generiert.
BEARBEITEN: Es ist besser, das Seeder-System zu verwenden, um die Generierung der Datenbankstruktur und die Datenbankpopulation zu unterscheiden.
quelle
$model = new App\UserRoles();
, aber ansonsten ... perfekt!Ich habe diese DB-Einfügemethode ausprobiert, aber da sie das Modell nicht verwendet, hat sie eine träge Eigenschaft ignoriert, die ich für das Modell hatte. Da das Modell für diese Tabelle vorhanden ist, dachte ich, dass das Modell zum Einfügen von Daten verfügbar sein würde, sobald es migriert ist. Und ich habe mir das ausgedacht:
Dies funktionierte korrekt und berücksichtigte auch die schleppbare Eigenschaft meines Modells, um automatisch eine Schnecke für diesen Eintrag zu generieren, und verwendet auch die Zeitstempel. NB. Das Hinzufügen der ID war nicht erforderlich. In diesem Beispiel wollte ich jedoch bestimmte IDs für meine Kategorien. Getestete Arbeit an Laravel 5.8
quelle
Wenn Sie bereits Spalten gefüllt und neue hinzugefügt haben oder alte Spalten mit neuen Scheinwerten füllen möchten, gehen Sie folgendermaßen vor:
quelle