【问题标题】:Error seeding table in Laravel?Laravel中的播种表错误?
【发布时间】:2014-12-08 03:34:39
【问题描述】:

我有一个播种机,它是 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'] 添加到列表模型之后,它就可以工作了。

但我希望它与我的其他播种机一起运行,那为什么不呢?如何取悦呢?

【问题讨论】:

    标签: php laravel seeding


    【解决方案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;');
    

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

    【讨论】:

      【解决方案2】:

      我会从头开始

      您必须将其添加到您的列表类模型中

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

      查看this

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

      【讨论】:

      • 好吧,不。当我运行整个 db:seed 时,Eloquent 是无人看管的;这应该避免对可填充部分的需要。此外,当已经存在一个 id = 2 的模型时,我在列表中有这个表播种器 LAST。我可以用他们的manufacturer_id fk 为我的模型播种就好了。不过,模型确实已经存在。
      • 无论如何,我什至没有大量分配名称,我注释掉了循环,所以现在我只是想让它与一个单一的记录一起工作。这不是“质量”任何东西。这只是一个。
      • 尝试将可填充的行添加到模型中,但它没有用。
      【解决方案3】:

      这里的问题是您之前创建的 FOREIGN 键。 models_manufacturer_id_foreign.

      所以你不能从表中删除行。

      你需要先放下它。

      种子完成后重新制作。

      【讨论】:

      • 我不会从任何表中删除行。我正在尝试将一个示例种子行添加到我的列表表中。一个Listing有一个引用model.id的fk model_id,而Model有一个引用manufacturer.id的fk manufacturer_id。在播种之前,我确实删除了列表表。 (参见 DB::table('listings')->delete();)。其他表已经存在,因此可以参考。
      • 你先删除行... DB::table('listings')->delete();
      猜你喜欢
      • 2014-08-26
      • 2014-11-26
      • 1970-01-01
      • 2019-11-14
      • 2014-07-28
      • 1970-01-01
      • 2016-08-08
      • 2017-08-02
      • 2017-07-21
      相关资源
      最近更新 更多