Właśnie uczę się Laravel i mam działający plik migracji, który tworzy tabelę użytkowników. Próbuję wypełnić rekord użytkownika w ramach migracji:
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
)
);
});
}
Ale podczas uruchamiania pojawia się następujący błąd php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Dzieje się tak oczywiście dlatego, że Artisan nie utworzył jeszcze tabeli, ale cała dokumentacja wydaje się mówić, że istnieje sposób wykorzystania Fluent Query do wypełnienia danych w ramach migracji.
Czy ktoś wie jak? Dzięki!
php
laravel
migration
mysql-error-1146
Adam Hopkinson
źródło
źródło
DB::table('users')->insert([ ['email' => '[email protected]', 'votes' => 0], ['email' => '[email protected]', 'votes' => 0] ]);
Wiem, że to stary post, ale ponieważ pojawia się w wyszukiwarce Google, pomyślałem, że podzielę się tutaj wiedzą. @ erin-geyer wskazał, że mieszanie migracji i seederów może powodować bóle głowy, a @justamartin odpowiedział, że czasami chcesz / potrzebujesz danych, które mają być wypełnione w ramach twojego wdrożenia.
Pójdę o krok dalej i powiem, że czasami pożądane jest konsekwentne wdrażanie zmian danych, aby można było na przykład wdrożyć do przemieszczania, zobaczyć, że wszystko jest w porządku, a następnie wdrożyć do produkcji z pewnością tych samych wyników (i nie musisz pamiętać o ręcznym wykonywaniu kroków).
Jednak oddzielenie nasion i migracji ma wartość, ponieważ są to dwie powiązane, ale odrębne kwestie. Nasz zespół poszedł na kompromis, tworząc migracje, które wywołują seedery. To wygląda następująco:
Pozwala to na jednorazowe wykonanie seeda, tak jak podczas migracji. Możesz także zaimplementować logikę, która zapobiega lub wzmacnia zachowanie. Na przykład:
Spowoduje to oczywiście warunkowe wykonanie siewnika, jeśli jest mniej niż 10 SomeModels. Jest to przydatne, jeśli chcesz uwzględnić siewnik jako standardowy siewnik, który wykonywał się, gdy dzwonisz,
artisan db:seed
jak również podczas migracji, aby nie „podwoić się”. Możesz również utworzyć siewnik odwrotny, aby wycofanie działało zgodnie z oczekiwaniami, npDrugi parametr
--force
jest wymagany, aby siewnik mógł pracować w środowisku produkcyjnym.źródło
Oto bardzo dobre wyjaśnienie, dlaczego korzystanie z bazy danych Laravel Seeder jest lepsze niż korzystanie z migracji: http://laravelbook.com/laravel-database-seeding/
Chociaż postępowanie zgodnie z instrukcjami w oficjalnej dokumentacji jest o wiele lepszym pomysłem, ponieważ implementacja opisana w powyższym linku wydaje się nie działać i jest niekompletna. http://laravel.com/docs/migrations#database-seeding
źródło
To powinno zrobić, co chcesz.
źródło
Innym czystym sposobem jest zdefiniowanie prywatnej metody, która tworzy instancję i utrzymuje odpowiedni Model.
Dzięki temu rozwiązaniu pola znaczników czasu będą generowane przez Eloquent.
EDYCJA: lepiej jest użyć systemu siewników do odróżnienia generowania struktury bazy danych i populacji bazy danych.
źródło
$model = new App\UserRoles();
, ale poza tym ... idealnie!Wypróbowałem tę metodę wstawiania DB, ale ponieważ nie używa ona modelu, zignorowała ona powolną cechę, którą miałem na modelu. Tak więc, biorąc pod uwagę, że model dla tej tabeli istnieje, po migracji doszedłem do wniosku, że model będzie dostępny do wstawiania danych. I wymyśliłem to:
To działało poprawnie, a także uwzględniono cechę powolną w moim modelu, aby automatycznie wygenerować informacje o tym wpisie, i również używa sygnatur czasowych. NB. Dodanie identyfikatora nie było konieczne, jednak w tym przykładzie chciałem mieć określone identyfikatory dla moich kategorii. Przetestowano pracę na Laravel 5.8
źródło
Jeśli masz już wypełnione kolumny i dodałeś nowe lub chcesz wypełnić starą kolumnę nowymi wartościami pozorowanymi, zrób to:
źródło