У меня есть сеялка, которая в последний раз вызывается в 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
Есть идеи, как решить эту проблему?
Смотрите здесь для моих классов модели Listing и производителя:
Как установить красноречивые отношения, принадлежащие через другую модель в 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']
к модели листинга по какой-то причине.
Но я бы хотел, чтобы он работал с остальными моими сеялками, так почему бы и нет, и как это может понравиться?
Внешний ключ не позволяет вам заполнить базу данных.
Вы можете либо отбросить его, как говорит Максимилиан, либо в вашем DatabaseSeeder, где вы регистрируете всех своих сидеров, чтобы запустить их, и окружить все ваши классы сеялок.
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
//... List of Seeder calls like
$this->call('some class');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
Это предотвратит все внешние ключи, мешающие вам заполнить вашу базу данных.
Я начну с конца
Вы должны будете добавить это в свою модель Listing Class
protected $fillable = array('name'); //or/and other fields that you want to exclude from mass assignement exception
проверять этот
Для первой ошибки я предполагаю, что вы установили внешний ключ (factory_id) в таблице моделей, которая ссылается на таблицу производителей (столбец id). Таким образом, ошибка, вероятно, возникает в сеялке таблицы моделей, когда вы пытаетесь заполнить таблицу внешним ключом, который не существует (вероятно, еще нет?).
Проблема здесь в том, что ваш ключ ИНОСТРАННЫЙ вы сделали ранее. models_manufacturer_id_foreign
,
Так что вы не может удалить строки из таблицы.
Вы должны бросить это сначала.
и переделать его, когда семя будет завершено.