Фреймворк Laravel MassAssignmentException во время посевных данных

У меня есть следующая проблема во время начальных данных в рамках Laravel.

php artisan db:seed --class=LevelsTableSeeder

[Illuminate\Database\Eloquent\MassAssignmentException]
level

Мой начальный файл (LevelsTableSeeder.php) выглядит следующим образом.

   <?php
use App\Models\Levels;
use Illuminate\Database\Seeder;
class LevelsTableSeeder extends Seeder {
public function run()
{
$levels = [
['level'=>1,  'xp_second'=>0.101, 'xp_hour'=>365.220],
['level'=>2,  'xp_second'=>0.104, 'xp_hour'=>365.220]
];
foreach($levels as $level) {
Levels::create($level);
}
$this->command->info('Levels seeded :-)');
}
}

И мой файл модели уровней следующим образом:

<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Cache;

class Levels extends Model {

protected $table = 'levels';

public function maxLevel()
{
return Cache::get('levels_max_level', function() {
return parent::max('level');
});
}
}

Не могли бы вы помочь мне?
С уважением.

0

Решение

MassAssignmentException генерируется всякий раз, когда вы пытаетесь назначить несколько полей в модели, а затем создаете их в базе данных. Чтобы защитить вашу базу данных, библиотека Eloquent предлагает вам защиту от массовых назначений, что означает, что будут приниматься только те поля, которые вы разрешаете назначать массовым образом.

Laravel 5.2 Документация для Eloquent

Добавьте к вашей модели атрибут protected $fillable с массивом полей, которые вы заинтересованы в массовом назначении:

<?php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Cache;

class Levels extends Model {

protected $table = 'levels';
protected $fillable = ['level', 'xp_second', 'xp_hour'];

public function maxLevel()
{
return Cache::get('levels_max_level', function() {
return parent::max('level');
});
}
}

Другой способ решить эту проблему — отменить защиту вашей модели, позвонив Levels::unguard() из вашего класса сеялки. Таким образом, вы отключите Guard, который защищает вашу модель от массового назначения.

 <?php
use App\Models\Levels;
use Illuminate\Database\Seeder;
class LevelsTableSeeder extends Seeder {
public function run()
{
Levels::unguard();   // to unguard your model
$levels = [
['level'=>1,  'xp_second'=>0.101, 'xp_hour'=>365.220],
['level'=>2,  'xp_second'=>0.104, 'xp_hour'=>365.220]
];
foreach($levels as $level) {
Levels::create($level);
}
$this->command->info('Levels seeded :-)');
Levels::guard(); // To guard back
}
}

Это приемлемое решение для посева, но не рекомендуется для действий контроллера.

0

Другие решения

Вы должны прочитать Laravel Docs, Laravel обеспечивает защиту от уязвимостей, связанных с массовым назначением, поэтому вам нужно сказать Laravel, какие поля можно массово назначить в вашей модели, используя $fillable имущество:

class Levels extends Model {

protected $fillable = ['level', 'xp_second', 'xp_hour'];

}
0

По вопросам рекламы [email protected]