MassAssignmentException в Laravel

Я новичок в 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'];
}

Предупреждение : будьте осторожны, когда разрешаете массовое назначение критических полей, таких как пароль или роль. Это может привести к проблемам безопасности, поскольку пользователи смогут обновлять значения этих полей, когда вы этого не хотите.

Комментарии (9)

Я использую фреймворк Laravel 4.2.

ошибки вы видите

[Illuminate\Database\Eloquent\MassAssignmentException]
username

действительно, потому что база данных надежно защищена от заполнения скопом, что вы делаете, когда вы выполняете сеялки. Однако, на мой взгляд, это's не нужно (и может быть небезопасно), чтобы объявить, какие поля должны быть заполняемые в вашей модели, Если вам нужно только выполнить сеялки.

В папке высева у вас есть класс DatabaseSeeder:

class DatabaseSeeder extends Seeder {

    /**
    * Run the database seeds.
    *
    * @return void
    */

    public function run()
    {
        Eloquent::unguard();

        //$this->call('UserTableSeeder');
    }
}

Этот класс действует как фасад, перечисляя все сеялок, которые необходимо выполнить. Если вы называете UsersTableSeeder сеялки вручную через ремесленником, как вы делали это с помощью PHP ремесленника дБ:семя-класс="и UsersTableSeeder"` в команду, вы обходите этот DatabaseSeeder класс.

В этом DatabaseSeeder класс команды красноречив::unguard(); позволяет временно массового назначения для всех таблиц, а это именно то, что вам нужно, когда вы находитесь заполнения базы данных. Этот метод unguard выполняется только при выполнении команды php в аристан дБ:семя`, следовательно, временного, а не делает заполняемых полей в модели (как указано в принятом и другие ответы).

Все, что вам нужно сделать, это добавить $это->по телефону('UsersTableSeeder'); на метод run в классе DatabaseSeeder и РНР аристан дБ:семя в свой Кинк, который по умолчанию будет выполнять DatabaseSeeder.

Также обратите внимание, что вы используете множественное число пользователей класса, в то время как Laraval используется форма единственного числа пользователей. Если вы решили изменить свой класс на обычных особой формы, можно просто раскомментировать `//$это->по телефону('UserTableSeeder'); по которым уже назначена, но по умолчанию закомментирован в DatabaseSeeder класс.

Комментарии (1)

Просто добавьте красноречив::unguard(); в верхней части запустить метод, когда вы делаете семян, нет необходимости, чтобы создать $заполняемые массив во всех моделях, нужно семя.

Обычно это уже указано в DatabaseSeeder класса. Однако, поскольку вы'повторного вызова UsersTableSeeder прямо:

в PHP ремесленника дБ:семя-класс=назальный UsersTableSeeder;

Красноречив::unguard(); разве'т быть вызван и дает ошибку.

Комментарии (0)

Чтобы сделать все поля, просто объявить в классе:

protected $guarded = array();

Это позволит вам вызвать метод Fill без объявления каждого поля.

Комментарии (0)

Я использовал это и не проблема:

protected $guarded=[];
Комментарии (0)

Правильная модель пользователя в файле контроллера.

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;
Комментарии (0)

Я получал 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

Комментарии (0)

Это не хороший способ, когда вы хотите заполнение базы данных.<БР> Используйте Факер вместо жесткого кодирования, и прежде чем все это, может быть, это's лучше для усечения таблицы. <БР>

Рассмотрим такой пример :

    // 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);
Комментарии (0)

Используйте заполняемые сказать, что Laravel, какие поля можно заполнить, используя массив. По умолчанию, Laravel не позволяют поля базы данных должны быть обновлены через массив

Protected $fillable=array('Fields you want to fill using array');

Напротив заполняемые составляет guardable.

Комментарии (0)

Если у вас есть таблица и поля в базе данных, вы можете просто использовать эту команду:

php artisan db:seed --class=UsersTableSeeder --database=YOURDATABSE
Комментарии (0)

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

$user = new User;
$user->username = 'Stevo';
$user->email = 'steve@rute.co.za';
$user->password = '45678';
$user->save();
Комментарии (0)