Я новичок в Laravel. Я хочу засеять мою базу данных. Когда я запускаю команду seed, я получаю исключение
[Illuminate\Database\Eloquent\MassAssignmentException] 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' ]); } }
Прочтите этот раздел документа Laravel: 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 вручную с помощью мастера, как и в команде php artisan db:seed --class="UsersTableSeeder"
, вы php artisan db:seed --class="UsersTableSeeder"
этот класс DatabaseSeeder.
В этом классе DatabaseSeeder используется команда Eloquent::unguard();
позволяет временное массовое присвоение всех таблиц, что именно то, что вам нужно при посеве базы данных. Этот неохраняемый метод выполняется только при запуске команды php aristan db:seed
, поэтому она является временной, а не делает поля заполняемыми в вашей модели (как указано в принятых и других ответах).
Все, что вам нужно сделать, это добавить $this->call('UsersTableSeeder');
к методу run в классе DatabaseSeeder и запустите php aristan db:seed
в вашем CLI, который по умолчанию будет выполнять DatabaseSeeder.
Также обратите внимание, что вы используете множественное имя класса Users, в то время как Laraval использует единственную форму User. Если вы решите изменить свой класс на обычную сингулярную форму, вы можете просто раскомментировать //$this->call('UserTableSeeder');
который уже был присвоен, но по умолчанию указан в классе DatabaseSeeder.
Просто добавьте Eloquent::unguard();
в верхней части метода запуска, когда вы делаете семя, не нужно создавать $fillable
array во всех моделях, которые вы должны семенировать.
Обычно это уже указано в классе DatabaseSeeder
. Однако, поскольку вы вызываете UsersTableSeeder
напрямую:
php artisan db:seed --class="UsersTableSeeder"
Eloquent::unguard();
не вызывается и дает ошибку.
Чтобы все поля заполнялись , просто объявите в своем классе:
protected $guarded = array();
Это позволит вам вызвать метод заполнения без объявления каждого поля.
Я получаю исключение MassAssignmentException, когда у меня расширяется моя модель.
class Upload extends Eloquent { }
Я пытался вставить массив как это
Upload::create($array);//$array was data to insert.
Проблема возникла, когда я создал Upload Model as
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 не позволяет обновлять поля базы данных через массив
Защищенный $ fillable = array ('Поля, которые вы хотите заполнить с помощью массива);
Противоположность заполняемой является защищенной.
Это не очень хорошо, если вы хотите вырезать базу данных.
Используйте 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);
Я использовал это и не имею проблем:
protected $guarded=[];
Если вы используете метод ввода ООП, вам не нужно беспокоиться о свойствах массового действия / заполнения:
$user = new User; $user->username = 'Stevo'; $user->email = 'steve@rute.co.za'; $user->password = '45678'; $user->save();