Saya baru mempelajari Laravel, dan memiliki file migrasi yang berfungsi membuat tabel pengguna. Saya mencoba mengisi catatan pengguna sebagai bagian dari migrasi:
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
)
);
});
}
Tapi saya mendapatkan kesalahan berikut saat menjalankan php artisan migrate
:
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'vantage.users' doesn't exist
Ini jelas karena Artisan belum membuat tabel, tetapi semua dokumentasi tampaknya mengatakan bahwa ada cara menggunakan Fluent Query untuk mengisi data sebagai bagian dari migrasi.
Ada yang tahu caranya? Terima kasih!
php
laravel
migration
mysql-error-1146
Adam Hopkinson
sumber
sumber
DB::table('users')->insert([ ['email' => '[email protected]', 'votes' => 0], ['email' => '[email protected]', 'votes' => 0] ]);
Saya tahu ini adalah posting lama tetapi karena muncul di pencarian google, saya pikir saya akan membagikan beberapa pengetahuan di sini. @erin-geyer menunjukkan bahwa menggabungkan migrasi dan seeder dapat membuat pusing kepala dan @justamartin membalas bahwa terkadang Anda ingin / membutuhkan data untuk diisi sebagai bagian dari penerapan Anda.
Saya akan melangkah lebih jauh dan mengatakan bahwa terkadang diinginkan untuk dapat meluncurkan perubahan data secara konsisten sehingga Anda dapat, misalnya, menerapkan ke pementasan, melihat bahwa semuanya baik-baik saja, dan kemudian menerapkan ke produksi dengan keyakinan akan hasil yang sama (dan tidak harus ingat untuk menjalankan beberapa langkah manual).
Namun, masih ada gunanya memisahkan benih dan migrasi karena keduanya terkait tetapi berbeda. Tim kami telah berkompromi dengan membuat migrasi yang disebut seeder. Ini terlihat seperti:
Ini memungkinkan Anda untuk mengeksekusi benih satu kali seperti migrasi. Anda juga bisa mengimplementasikan logika yang mencegah atau menambah perilaku. Sebagai contoh:
Ini jelas akan mengeksekusi seeder Anda secara bersyarat jika ada kurang dari 10 SomeModels. Ini berguna jika Anda ingin menyertakan seeder sebagai seeder standar yang dijalankan saat Anda memanggil
artisan db:seed
serta saat Anda bermigrasi sehingga Anda tidak "menggandakan". Anda juga dapat membuat seeder terbalik sehingga rollback bekerja seperti yang diharapkan, misParameter kedua
--force
diperlukan untuk mengaktifkan seeder untuk berjalan di lingkungan produksi.sumber
Berikut adalah penjelasan yang sangat bagus tentang mengapa menggunakan Database Seeder Laravel lebih disukai daripada menggunakan Migrasi: http://laravelbook.com/laravel-database-seeding/
Meskipun, mengikuti petunjuk pada dokumentasi resmi adalah ide yang jauh lebih baik karena penerapan yang dijelaskan pada tautan di atas tampaknya tidak berfungsi dan tidak lengkap. http://laravel.com/docs/migrations#database-seeding
sumber
Ini harus melakukan apa yang Anda inginkan.
sumber
Cara bersih lainnya untuk melakukannya adalah dengan mendefinisikan metode privat yang membuat contoh dan mempertahankan Model terkait.
Dengan solusi ini, bidang cap waktu akan dibuat oleh Eloquent.
EDIT: lebih baik menggunakan sistem seeder untuk membedakan pembuatan struktur database dan populasi database.
sumber
$model = new App\UserRoles();
, tetapi selain itu ... sempurna!Saya mencoba metode penyisipan DB ini, tetapi karena tidak menggunakan model, metode ini mengabaikan sifat lamban yang saya miliki pada model. Jadi, mengingat Model untuk tabel ini ada, segera setelah dimigrasi, saya pikir model tersebut akan tersedia untuk digunakan untuk memasukkan data. Dan saya datang dengan ini:
Ini berfungsi dengan benar, dan juga memperhitungkan sifat lamban pada Model saya untuk secara otomatis menghasilkan siput untuk entri ini, dan menggunakan cap waktu juga. NB. Tidak perlu menambahkan ID, namun, saya menginginkan ID khusus untuk kategori saya dalam contoh ini. Diuji bekerja pada Laravel 5.8
sumber
Jika Anda sudah mengisi kolom dan telah menambahkan yang baru atau Anda ingin mengisi kolom lama dengan nilai tiruan baru, lakukan ini:
sumber