MassAssignmentException в Laravel
Я новичок Laravel. Я хочу засеять свою базу данных. Когда я запускаю команду seed, я получаю исключение
[IlluminateDatabaseEloquentMassAssignmentException]
username
db:seed [--class[="..."]] [--database[="..."]]
что я делаю не так. Команда, которую я использую:
php artisan db:seed --class="UsersTableSeeder"
мой класс семян выглядит следующим образом:
class UsersTableSeeder extends Seeder {
public function run()
{
User::truncate();
User::create([
'username' => 'PaulSheer',
'email' => 'psheer@rute.co.za',
'password' => '45678'
]);
User::create([
'username' => 'Stevo',
'email' => 'steve@rute.co.za',
'password' => '45678'
]);
}
}
11 ответов:
прочитайте этот раздел Laravel doc:http://laravel.com/docs/eloquent#mass-assignment
Laravel по умолчанию обеспечивает защиту от проблем безопасности массового назначения. Вот почему вы должны вручную определить, какие поля могут быть "массово назначены":
class User extends Model { protected $fillable = ['username', 'email', 'password']; }
предупреждение : будьте осторожны, когда вы разрешаете массовое назначение критических полей, таких как
password
илиrole
. Это может привести к проблеме безопасности, потому что пользователи могут будьте в состоянии обновить эти значения полей, когда вы не хотите.
я использую Laravel 4.2.
ошибка, которую вы видите
[Illuminate\Database\Eloquent\MassAssignmentException] username
действительно, потому что база данных защищена от массового заполнения, что и происходит, когда вы выполняете сеялку. Однако, на мой взгляд, нет необходимости (и может быть небезопасно) объявлять, какие поля должны быть заполняемыми в вашей модели, если вам нужно только выполнить сеялку.
в папке посева у вас есть DatabaseSeeder класс:
class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Eloquent::unguard(); //$this->call('UserTableSeeder'); } }
этот класс действует как фасад, перечисляя все сеялки, которые должны быть выполнены. Если вы вызываете сеялку UsersTableSeeder вручную через artisan, как вы сделали с
php artisan db:seed --class="UsersTableSeeder"
команда, вы обходите этот класс DatabaseSeeder.в этом классе DatabaseSeeder команда
Eloquent::unguard();
позволяет временное массовое назначение на всех таблицах, что именно то, что вам нужно, когда вы заполняете базу данных. Этот метод unguard выполняется только при запускеphp aristan db:seed
команда, следовательно, она является временной, а не делает поля заполняемыми в вашей модели (как указано в принятых и других ответах).все, что вам нужно сделать, это добавить
$this->call('UsersTableSeeder');
к методу run в классе DatabaseSeeder и runphp aristan db:seed
в вашем CLI, который по умолчанию будет выполнять DatabaseSeeder.также Примечание!--24--> что вы используете множественное имя класса пользователей, в то время как Laraval использует единственную форму пользователя. Если вы решите изменить свой класс на обычная сингулярная форма, вы можете просто раскомментировать
//$this->call('UserTableSeeder');
который уже был назначен, но закомментирован по умолчанию в классе DatabaseSeeder.
просто добавить
Eloquent::unguard();
в верхней части метода run, когда вы делаете семя, нет необходимости создавать$fillable
массив во всех моделях, которые вы должны затравить.обычно это уже указано в
DatabaseSeeder
класса. Однако, потому что вы называетеUsersTableSeeder
напрямую:
php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
не вызывается и выдает ошибку.
и все заполняемые поля, просто объявите в своем классе:
protected $guarded = array();
Это позволит вам вызвать метод Fill без объявления каждого поля.
я получал MassAssignmentException, когда у меня есть расширяет мою модель, как это.
class Upload extends Eloquent { }
Я пытался вставить массив вот так
Upload::create($array);//$array was data to insert.
проблема была решена когда я создал загрузить модель как
class Upload extends Eloquent { protected $guarded = array(); // Important }
Ссылка https://github.com/aidkit/aidkit/issues/2#issuecomment-21055670
правильная модель пользователя в вашем файле контроллера.
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\User;
если у вас есть таблицы и поля в базе данных, вы можете просто использовать эту команду :
php artisan db:seed --class=UsersTableSeeder --database=YOURDATABSE
используйте fillable, чтобы сказать laravel, какие поля могут быть заполнены с помощью массива. По умолчанию laravel не позволяет обновлять поля базы данных через array
Protected $fillable=array ('поля, которые вы хотите заполнить с помощью массива');
противоположность fillable guardable.
это не очень хороший способ, когда вы хотите, чтобы заполнить базу данных.
Используйте faker вместо жесткого кодирования, и перед всем этим, возможно, лучше усечь таблицы.Рассмотрим пример :
// 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);