У меня есть следующая проблема во время начальных данных в рамках 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');
});
}
}
Не могли бы вы помочь мне?
С уважением.
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
}
}
Это приемлемое решение для посева, но не рекомендуется для действий контроллера.
Вы должны прочитать Laravel Docs, Laravel обеспечивает защиту от уязвимостей, связанных с массовым назначением, поэтому вам нужно сказать Laravel, какие поля можно массово назначить в вашей модели, используя $fillable
имущество:
class Levels extends Model {
protected $fillable = ['level', 'xp_second', 'xp_hour'];
}