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 89

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 и run php 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 без объявления каждого поля.

я использовал это и не имею никаких проблем:

protected $guarded=[];

я получал 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);

Если вы используете метод ООП вставки, вам не нужно беспокоиться о массовых действий/заполняемые свойства:

$user = new User;
$user->username = 'Stevo';
$user->email = 'steve@rute.co.za';
$user->password = '45678';
$user->save();