Laravel播种表出错?

时间:2014-10-13 14:18:39

标签: php laravel seeding

我有一个播种机,它是DatabaseSeeder中调用的最后一个播种机。当我调用db:seed时,出现以下错误:

  [Illuminate\Database\QueryException]                                                        
  SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row  
  : a foreign key constraint fails (`catalara`.`models`, CONSTRAINT `models_manufacturer_id_  
  foreign` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturers` (`id`)) (SQL: delete f  
  rom `manufacturers`)                                                                        

  [PDOException]                                                                              
  SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row  
  : a foreign key constraint fails (`catalara`.`models`, CONSTRAINT `models_manufacturer_id_  
  foreign` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturers` (`id`))  

当我指定要种子的类时,我得到这个:

[Illuminate\Database\Eloquent\MassAssignmentException]  
  name  

如何解决这个问题?

请参阅此处查看我的清单和制造商模型类: How to set Eloquent relationship belongsTo THROUGH another model in Laravel?

这是有问题的播种机:     使用Faker \ Factory作为Faker;

class ListingsTableSeeder extends Seeder {

    public function run()
    {
        DB::table('listings')->delete();

        $faker = Faker::create();

        $modelCt = count(Model::all());
        $conditions = ['New', 'Used'];
        $layouts = ['Owner', 'Charter'];
        $hull_configs = ['Monohull', 'Catamaran', 'Trimaran'];

        foreach(range(1, 10) as $index)
        {

            Listing::create([
                'name' => ucwords($faker->firstName),
                'model_id' => rand(1,$modelCt),
                'length' => rand(1,160),
                'condition' => array_rand(array_flip($conditions)),
                'layout' => array_rand(array_flip($layouts)),
                'hull_config' => array_rand(array_flip($hull_configs)),
                'created_at' => new DateTime,
                'updated_at' => new DateTime
            ]);
        }
    }

}

我只是在运行db:seed --class=ListingsTableSeeder时才开始工作,但是当我只运行db:seed时却没有,即使它是在DatabaseSeeder中调用的最后一个播种器。出现同样的错误。但是当我单独运行它时,由于某种原因我将protected $guarded = ['id']添加到Listing模型后,它才有效。

但是我希望与其他播种机一起运行,为什么不这样做呢?它又怎么样?

3 个答案:

答案 0 :(得分:1)

外键阻止您播种数据库。

您可以像Maximilian所说的那样放弃它,也可以在您注册所有播种器的DatabaseSeeder中放置它,将其放在所有Seeder类的周围。

DB::statement('SET FOREIGN_KEY_CHECKS=0;');

//... List of Seeder calls like
$this->call('some class');

DB::statement('SET FOREIGN_KEY_CHECKS=1;');

这将阻止所有外键阻止您播种数据库。

答案 1 :(得分:0)

我将从结束开始

您必须在清单类模型中添加它

protected $fillable = array('name'); //or/and other fields that you want to exclude from mass assignement exception 

检查this

对于第一个错误,我猜你在models表中设置了一个引用制表(id列)的外键(manufacturer_id)。因此,当您尝试使用不存在的外键(可能还没有?)填充表时,模型表播种器中可能会发生错误。

答案 2 :(得分:0)

这里的问题是您之前制作的FOREIGN键。 models_manufacturer_id_foreign

因此无法从表中删除行

你需要先放弃它。

并在种子完成后重新制作。