#laravel
#laravel
Вопрос:
Я новичок в Laravel и пытаюсь создать простую базу данных. Вопрос касается проблемы с внешним ключом. Я прочитал документацию, но не нашел никакого решения.
Это ошибка: SQLSTATE[23000]: нарушение ограничения целостности: 1452 Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа ( vlogit
. posts
, posts_user_id_foreign
ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ ( user_id
) ОГРАНИЧЕНИЯ users
( id
) ПРИ КАСКАДЕ УДАЛЕНИЯ ПРИ КАСКАДЕ ОБНОВЛЕНИЯ) (SQL: вставить в posts
( user_id
, , category_id
, name
, slug
, excerpt
, body
, file
, status
, updated_at
, created_at
) значения (28, 18, Voluptas qui ut., voluptas-qui-ut, Sint qui ut rem doloribus. Minima perferendis dolorem totam accusantium incidunt eveniet ipsa. Quisquam qui non sed tempore molestiae cum. Assumenda vitae voluptas optio aut dolor velit., Corrupti optio esse omnis laboriosam commodi consequatur ut blanditiis. Labore et iste atque accusamus magnam magnam id. Consequuntur odit sequi saepe earum ipsam. Aut nihil sapiente repellendus recusandae. Maxime quia enim qui. Mollitia illum accusamus sit non itaque perspiciatis. Est ullam ullam placeat consequatur fugiat ut. Velit laudantium et praesentium. Necessitatibus nobis illo modi ut consectetur fuga dolorem labore. Sed sed in quisquam voluptatem. Ea sit ad officiis quam quam., https://via.placeholder.com/1200×400.png/0066cc?text=voluptas , ОПУБЛИКОВАННЫЙ, 2020-11-21 23:46:59, 2020-11-21 23:46:59))
База данных представляет собой простой блог со столбцами User, Category, Post и Tag. БД корректно работает с сообщениями, категориями и пользователями, но не с post_tags. Я думаю, что эта ошибка возникает здесь:
Миграция: post_tag_table
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
class CreatePostTagTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->integer('tag_id')->unsigned();
$table->timestamps();
//Relaciones
$table->foreign('post_id')->references('id')->on('posts')
->onDelete('cascade')
->onUpdate('cascade');
$table->foreign('tag_id')->references('id')->on('tags')
->onDelete('cascade')
->onUpdate('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('post_tag');
}
}
PostFactory.php
<?php
namespace DatabaseFactories;
use AppModelsPost;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class PostFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Post::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
$title = $this->faker->sentence(4);
return [
'user_id' => rand(1,30),
'category_id' => rand(1,20),
'name' => $title,
'slug' => Str::slug($title),
'excerpt' => $this->faker->text(200),
'body' => $this->faker->text(500),
'file' => $this->faker->imageUrl($width = 1200, $height = 400),
'status' =>$this->faker->randomElement(['DRAFT', 'PUBLISHED']),
];
}
}
TagFactory.php
<?php
namespace DatabaseFactories;
use AppModelsTag;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class TagFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Tag::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
$title = $this->faker->sentence(4);
return [
'name' => $title,
'slug' => Str::slug($title),
];
}
}
PostTableSeeder.php
<?php
namespace DatabaseSeeders;
use IlluminateDatabaseSeeder;
class PostsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
AppModelsPost::factory(300)->create()->each(function(AppModelsPost $post) {
$post->tags()->attach([
rand(1,5),
rand(6,14),
rand(15,20)
]);
});
}
}
Комментарии:
1. Все поля, являющиеся внешними ссылками, должны иметь соответствующие ключи в таблице, на которую они ссылаются … у вас есть 30 пользователей в таблице «пользователи»?
2. Я исправил эту ошибку. Теперь ошибка laravel не появляется, и у меня есть 30 пользователей, 30 сообщений и 30 тегов в базе данных, но по-прежнему 0 для столбца post_tag.
3. БД корректно работает с сообщениями, категориями и пользователями, но не с post_tags. но ошибка для
posts
таблицы. => «вставить в сообщения (user_id, category_id, name, slug, выдержка, тело, файл, статус, updated_at, created_at) » Не дляpost_tags
.
Ответ №1:
Как указал @lagbox, в таблице пользователей должно быть 30 записей с идентификаторами от 1 до 30.
Однако более подходящим способом определения способа Post factory — Laravel является использование связей через фабрики 'user_id' => AppModelsUser::factory()
<?php
namespace DatabaseFactories;
use AppModelsPost;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class PostFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Post::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
$title = $this->faker->sentence(4);
return [
'user_id' => AppModelsUser::factory(),
'category_id' => rand(1,20),
'name' => $title,
'slug' => Str::slug($title),
'excerpt' => $this->faker->text(200),
'body' => $this->faker->text(500),
'file' => $this->faker->imageUrl($width = 1200, $height = 400),
'status' =>$this->faker->randomElement(['DRAFT', 'PUBLISHED']),
];
}
}
Еще одна вещь, которую следует иметь в виду, — это порядок миграций
Комментарии:
1. Да, я исправил это, чтобы сделать 30 регистров. И насчет ‘user_id’ я попробовал ваше предложение, но в столбце post_tag DB по-прежнему равно 0.
2. Пока нет, столбец post_tag по-прежнему равен 0. Я не знаю причину, по которой он не регистрирует никаких данных
3.
post_tag
столбец или таблица?4. Теперь Laravel не выводит никаких ошибок, благодаря предложению @lagbox. Но в таблице post_tag по-прежнему 0 регистров.
5. Порядок заполнения правильный, пользователь, категория, сообщение и тег, но я не знаю причины, по которой таблица post_tag не сохраняет никаких данных.
Ответ №2:
Решаемая. Это была проблема с общим файлом seeder.
DatabaseSeeder.php
$this->call(UsersTableSeeder::class);
$this->call(CategoriesTableSeeder::class);
$this->call(TagsTableSeeder::class);
$this->call(PostsTableSeeder::class);
И теперь работает правильно.
CategoriesTableSeeder.php
public function definition()
{
$title = $this->faker->sentence(4);
return [
'name' => $title,
'slug' => Str::slug($title),
'body' => $this->faker->text(500),
];
}
PostTableSeeder.php
public function definition()
{
$title = $this->faker->sentence(4);
return [
'user_id' => rand(1,30),
'category_id' => rand(1,30),
'name' => $title,
'slug' => Str::slug($title),
'excerpt' => $this->faker->text(200),
'body' => $this->faker->text(500),
'file' => $this->faker->imageUrl($width = 1200, $height = 400),
'status' =>$this->faker->randomElement(['DRAFT', 'PUBLISHED']),
];
}
TagTableSeeder.php
public function definition()
{
$title = $this->faker->unique()->word(4);
return [
'name' => $title,
'slug' => Str::slug($title),
];
}
Я делюсь кодом, чтобы помочь другим новичкам.