我认为Post和Category之间的关系不正确。一篇帖子属于零个或多个类别(您可以在应用程序层中限制为一个或多个),并且一个类别可以与零个或多个帖子关联。这种类型的关系称为多对多.
帖子属于ToMany类别
类别属于ToMany 帖子
下面是表结构:
----- 帖子 -----
id INT
标题 VARCHAR(100)
主体
----- 类别_帖子 -----
类别 ID INT
帖子 ID INT
----- 类别 -----
id INT
名称 VARCHAR(100)
你应该做的是:
1 - 创建一个新的迁移到category_post表
<?php
// migrations/****_**_**_******_create_posts_table.php
Schema::create('posts', function(Blueprint $table) {
$table->increments('id');
$table->string('title', 100);
$table->text('body');
});
// migrations/****_**_**_******_create_categories_table.php
Schema::create('categories', function(Blueprint $table) {
$table->increments('id');
$table->string('name', 100);
});
// migrations/****_**_**_******_create_category_post_table.php
Schema::create('category_post', function(Blueprint $table) {
$table->integer('category_id')->unsigned();
$table->integer('post_id')->unsigned();
$table->primary(['category_id', 'post_id']);
$table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
$table->foreign('post_id')->references('id')->on('posts')->onUpdate('cascade')->onDelete('cascade');
});
2 - 更改 Eloquent 模型中帖子和类别之间的关系。
<?php
// Post.php
public function categories()
{
return $this->belongsToMany(Category::class);
}
// Category.php
public function posts()
{
return $this->belongsToMany(Post::class);
}
现在你可以做这样的事情:
// PostController.php
public function create()
{
$categories = Category::all();
return view('posts.create', compact('categories'));
}
public function store(Request $request)
{
$this->validate($request, [
// Validate the max number of characters to avoid database truncation
'title' => ['required', 'string', 'max:100'],
'body' => ['required', 'string'],
// The user should select at least one category
'categories_id' => ['required', 'array', 'min:1'],
'categories_id.*' => ['required', 'integer', 'exists:categories,id'],
]);
$post = new Post();
$post->title = $request->title;
$post->body = $request->body;
$post->categories()->attach($request->categories_id);
return redirect()->route('posts.index');
}
// views/posts/create.blade.php
<select name="categories_id" multiple>
@foreach ($categories as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>