我有一个播种机,它是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模型后,它才有效。
但是我希望与其他播种机一起运行,为什么不这样做呢?它又怎么样?
答案 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
。
因此无法从表中删除行。
你需要先放弃它。
并在种子完成后重新制作。