Laravel中的播种表错误?

Posted

技术标签:

【中文标题】Laravel中的播种表错误?【英文标题】:Error seeding table in 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'] 添加到列表模型之后,它就可以工作了。

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

【问题讨论】:

【参考方案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();

以上是关于Laravel中的播种表错误?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4中的动态播种

Laravel - 播种多对多关系

在 laravel 7 中播种时无法截断表格

Laravel4 数据库播种器错误 - 调用未定义的方法 SeedDummyOrders::setContainer()

Laravel:当表有两个外键时,为具有关系的数据库表播种

如何使用数据库将数据从一个表导入另一个表:播种? (laravel 5.3)?