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中的播种表错误?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel4 数据库播种器错误 - 调用未定义的方法 SeedDummyOrders::setContainer()