我在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 :-)');
}
}
我的Levels模型文件如下:
<?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 :(得分:0)
每当您尝试在模型中分配多个字段然后在数据库中创建它时,就会抛出MassAssignmentException。为了保护您的数据库,Eloquent库为您提供了批量分配保护,这意味着只接受您允许批量分配的字段。
Laravel 5.2 Documentation for 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
}
}
这是用于播种目的的可接受的解决方案,但不推荐用于控制器操作。
答案 1 :(得分:0)
您应该阅读Laravel Docs,Laravel提供了对Mass Assignment漏洞的保护,因此您实际上必须使用$fillable
属性告诉Laravel您的模型中哪些字段可以进行质量分配:
class Levels extends Model {
protected $fillable = ['level', 'xp_second', 'xp_hour'];
}