php - 种子数据期间的Laravel框架MassAssignmentException

时间:2016-01-30 03:27:46

标签: php laravel database-migration seed

我在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');
        });
    }
}
你可以帮帮我吗? 问候。

2 个答案:

答案 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'];

}