Saya Laravel newbie. Saya ingin benih database saya. Ketika saya menjalankan benih perintah 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"
Saya kelas benih 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'
]);
}
}
Membaca bagian ini dari Laravel doc : http://laravel.com/docs/eloquent#mass-assignment
Laravel menyediakan secara default perlindungan terhadap massa penugasan masalah keamanan. Yang's mengapa anda harus secara manual menetapkan bidang yang bisa menjadi "massa ditugaskan" :
class User extends Model
{
protected $fillable = ['username', 'email', 'password'];
}
Peringatan : hati-hati bila anda mengizinkan massa penugasan kritis bidang-bidang seperti password
atau peran
. Hal itu bisa menyebabkan masalah keamanan karena pengguna bisa dapat update ini bidang nilai-nilai ketika anda don't ingin.
Saya menggunakan Laravel 4.2.
kesalahan anda melihat
[Illuminate\Database\Eloquent\MassAssignmentException]
username
memang ini karena database dilindungi dari mengisi secara massal, yang adalah apa yang anda lakukan ketika anda mengeksekusi seeder. Namun, dalam pendapat saya, itu's tidak perlu (dan mungkin tidak aman) untuk menyatakan bidang yang seharusnya bisa diisi dalam model anda jika anda hanya perlu untuk menjalankan seeder.
Dalam penyemaian folder anda memiliki DatabaseSeeder kelas:
class DatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguard();
//$this->call('UserTableSeeder');
}
}
Kelas ini bertindak sebagai fasad, daftar semua seeders yang harus dilaksanakan. Jika anda menelepon UsersTableSeeder seeder secara manual melalui artisan, seperti yang anda lakukan dengan php artisan db:benih --class="UsersTableSeeder"
command, anda melewati ini DatabaseSeeder kelas.
Dalam hal ini DatabaseSeeder kelas perintah Fasih::unguard();
memungkinkan sementara massa penugasan pada semua tabel, yang adalah apa yang anda butuhkan ketika anda pembenihan database. Ini unguard metode ini hanya dijalankan ketika anda menjalankan php aristan db:benih
perintah, maka itu bersifat sementara sebagai lawan untuk membuat bidang yang bisa diisi dalam model anda (seperti yang dinyatakan dalam diterima dan jawaban yang lain).
Semua yang perlu anda lakukan adalah menambahkan $this->panggilan('UsersTableSeeder');
untuk menjalankan metode dalam DatabaseSeeder kelas dan menjalankan php aristan db:benih
di CLI yang secara default akan mengeksekusi DatabaseSeeder.
Perhatikan bahwa anda menggunakan bentuk jamak classname Pengguna, sementara Laraval menggunakan bentuk tunggal Pengguna. Jika anda memutuskan untuk mengubah kelas anda untuk konvensional bentuk tunggal, anda hanya dapat tanda //$this->panggilan('UserTableSeeder');
yang telah ditetapkan tetapi komentar secara default di DatabaseSeeder kelas.
Hanya menambahkan Fasih::unguard();
di atas menjalankan metode ketika anda melakukan benih, tidak perlu membuat $fillable
array dalam semua model yang anda harus benih.
Biasanya ini sudah ditentukan dalam DatabaseSeeder
kelas. Namun karena anda're memanggil UsersTableSeeder
langsung:
php artisan db:benih --class="UsersTableSeeder"
Fasih::unguard();
isn't dipanggil dan memberikan kesalahan.
Saya mendapatkan MassAssignmentException ketika saya telah meluas saya model seperti ini.
class Upload extends Eloquent {
}
Aku mencoba untuk memasukkan array seperti ini
Upload::create($array);//$array was data to insert.
Masalah telah menyelesaikan ketika saya dibuat Tanggal sebagai Model
class Upload extends Eloquent {
protected $guarded = array(); // Important
}
Referensi https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
Ini bukan cara yang baik ketika anda ingin penyemaian database.
Gunakan faker bukan hard coding, dan sebelum semua ini mungkin itu's baik untuk memotong tabel.
Pertimbangkan contoh ini :
// Truncate table.
DB::table('users')->truncate();
// Create an instance of faker.
$faker = Faker::create();
// define an array for fake data.
$users = [];
// Make an array of 500 users with faker.
foreach (range(1, 500) as $index)
{
$users[] = [
'group_id' => rand(1, 3),
'name' => $faker->name,
'company' => $faker->company,
'email' => $faker->email,
'phone' => $faker->phoneNumber,
'address' => "{$faker->streetName} {$faker->postCode} {$faker->city}",
'about' => $faker->sentence($nbWords = 20, $variableNbWords = true),
'created_at' => new DateTime,
'updated_at' => new DateTime,
];
}
// Insert into database.
DB::table('users')->insert($users);
Gunakan bisa diisi untuk katakan laravel bidang yang dapat diisi dengan menggunakan array. Secara default, Laravel tidak memungkinkan bidang database akan diperbarui melalui array
Protected $fillable=array('Fields you want to fill using array');
Kebalikan dari bisa diisi adalah guardable.
Jika anda menggunakan OOP metode memasukkan, anda don't perlu khawatir tentang massa-aksi/bisa diisi sifat:
$user = new User;
$user->username = 'Stevo';
$user->email = '[email protected]';
$user->password = '45678';
$user->save();