Ошибка заполнения таблицы в Laravel?

У меня есть сеялка, которая в последний раз вызывается в 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'] к модели листинга по какой-то причине.

Но я бы хотел, чтобы он работал с остальными моими сеялками, так почему бы и нет, и как это может понравиться?

1

Решение

Внешний ключ не позволяет вам заполнить базу данных.

Вы можете либо отбросить его, как говорит Максимилиан, либо в вашем DatabaseSeeder, где вы регистрируете всех своих сидеров, чтобы запустить их, и окружить все ваши классы сеялок.

DB::statement('SET FOREIGN_KEY_CHECKS=0;');

//... List of Seeder calls like
$this->call('some class');

DB::statement('SET FOREIGN_KEY_CHECKS=1;');

Это предотвратит все внешние ключи, мешающие вам заполнить вашу базу данных.

1

Другие решения

Я начну с конца

Вы должны будете добавить это в свою модель Listing Class

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

проверять этот

Для первой ошибки я предполагаю, что вы установили внешний ключ (factory_id) в таблице моделей, которая ссылается на таблицу производителей (столбец id). Таким образом, ошибка, вероятно, возникает в сеялке таблицы моделей, когда вы пытаетесь заполнить таблицу внешним ключом, который не существует (вероятно, еще нет?).

0

Проблема здесь в том, что ваш ключ ИНОСТРАННЫЙ вы сделали ранее. models_manufacturer_id_foreign,

Так что вы не может удалить строки из таблицы.

Вы должны бросить это сначала.

и переделать его, когда семя будет завершено.

0
По вопросам рекламы [email protected]