Saya seorang pemula Laravel. Saya ingin melakukan seed database saya. Ketika saya menjalankan perintah seed, saya mendapatkan pengecualian
[Illuminate\Database\Eloquent\MassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
Apa yang saya lakukan salah. Perintah yang saya gunakan adalah:
php artisan db:seed --class="UsersTableSeeder"
Kelas benih saya adalah sebagai berikut:
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
dan karena menurutnya jawaban saya adalah solusi umum yang baik, saya akan menyimpannya apa adanya.Saya menggunakan Laravel 4.2.
kesalahan yang Anda lihat
memang karena database dilindungi dari pengisian secara massal, itulah yang Anda lakukan saat menjalankan seeder. Namun, menurut pendapat saya, tidak perlu (dan mungkin tidak aman) untuk mendeklarasikan bidang mana yang harus dapat diisi dalam model Anda jika Anda hanya perlu menjalankan seeder.
Di folder seeding, Anda memiliki kelas DatabaseSeeder:
Kelas ini bertindak sebagai fasad, mendaftar semua seeder yang perlu dieksekusi. Jika Anda memanggil seeder UsersTableSeeder secara manual melalui artisan, seperti yang Anda lakukan dengan
php artisan db:seed --class="UsersTableSeeder"
perintah, Anda melewati kelas DatabaseSeeder ini.Di kelas DatabaseSeeder ini, perintah
Eloquent::unguard();
memungkinkan penugasan massal sementara di semua tabel, yang persis seperti yang Anda butuhkan saat melakukan seeding database. Metode lengah ini hanya dijalankan saat Anda menjalankanphp aristan db:seed
perintah, oleh karena itu bersifat sementara dibandingkan membuat bidang dapat diisi dalam model Anda (seperti yang dinyatakan dalam jawaban yang diterima dan jawaban lainnya).Yang perlu Anda lakukan adalah menambahkan metode
$this->call('UsersTableSeeder');
ke run di kelas DatabaseSeeder dan menjalankannyaphp aristan db:seed
di CLI yang secara default akan menjalankan DatabaseSeeder.Perhatikan juga bahwa Anda menggunakan nama kelas jamak Users, sedangkan Laraval menggunakan bentuk tunggal User. Jika Anda memutuskan untuk mengubah kelas Anda ke bentuk tunggal konvensional, Anda cukup menghapus komentar
//$this->call('UserTableSeeder');
yang telah ditetapkan tetapi memberi komentar secara default di kelas DatabaseSeeder.sumber
\Eloquent::reguard();
, karena setelah Tugas Massa Anda selesai.Untuk membuat semua bidang bisa diisi , cukup nyatakan di kelas Anda:
Ini akan memungkinkan Anda untuk memanggil metode pengisian tanpa mendeklarasikan setiap bidang.
sumber
Cukup tambahkan
Eloquent::unguard();
di bagian atas metode run ketika Anda melakukan seed, tidak perlu membuat$fillable
array di semua model yang harus Anda seed.Biasanya ini sudah ditentukan di
DatabaseSeeder
kelas. Namun karena Anda meneleponUsersTableSeeder
secara langsung:php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
tidak dipanggil dan memberikan kesalahan.sumber
Saya menggunakan ini dan tidak punya masalah:
sumber
Saya mendapatkan MassAssignmentException saat saya memperluas model saya seperti ini.
Saya mencoba memasukkan array seperti ini
Masalah telah diatasi saat saya membuat Model Unggahan sebagai
Referensi https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
sumber
Model yang sesuai pengguna di file pengontrol Anda.
sumber
jika Anda memiliki tabel dan bidang di database Anda cukup menggunakan perintah ini:
sumber
Ini bukan cara yang baik saat Anda ingin melakukan seeding database.
Gunakan faker daripada hard coding, dan sebelum semua ini mungkin lebih baik untuk memotong tabel.
Pertimbangkan contoh ini:
sumber
Gunakan bisa diisi untuk memberitahu LARAVEL yang bidang dapat diisi menggunakan array. Secara default, Laravel tidak mengizinkan bidang database diperbarui melalui array
Kebalikan dari yang bisa diisi adalah guardable .
sumber
Jika Anda menggunakan metode penyisipan OOP, Anda tidak perlu khawatir tentang properti aksi massa / yang dapat diisi:
sumber