我需要知道如何在表格post_tag
的列post_id
中保存帖子的ID?现在,当我添加新帖子时,表格中仅保存{{1 }},您能帮我些帮助吗?我正在看一个教程,但仍然遇到这个问题。谢谢。
create_post_tag_table
tag_id
具有函数存储的PostsController
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostTagTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts');
$table->integer('tag_id')->unsigned();
$table->foreign('tag_id')->references('id')->on('tags');
});
}
}
create_tags_table
public function store(Request $request )
{
$data = request()->validate([
'caption' => 'required|max:255',
'image' => 'required|image',
]);
$post = new Post;
$post->tags()->sync($request->tags, false);
$imagePath = request('image')->store('uploads', 'public');
$image = Image::make(public_path("storage/{$imagePath}"))->fit(1600, 1100);
$image->save();
auth()->user()->posts()->create([
'caption' => $data['caption'],
'image' => $imagePath,
]);
return redirect('/profile/' . auth()->user()->id);
}
create_posts_table
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->timestamps();
});
}
现在,在 public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->string('caption');
$table->string('image');
$table->timestamps();
$table->index('user_id');
});
}
和$post = new Post;
这行中,我的标签ID被保存在$post->tags()->sync($request->tags, false);
列中,但我在表tag_id
中的新帖子ID却没有。我将帖子ID保存在posts
表中了吗?
答案 0 :(得分:1)
您要创建两个不同的Post对象。
$post = new Post;
$post->tags()->sync($request->tags, false);
auth()->user()->posts()->create([ // this creates another one
'caption' => $data['caption'],
'image' => $imagePath,
]);
对您要实现的目标一无所知。我认为您可以通过创建新逻辑,而不是将新逻辑保存到用户中来获得所需的逻辑。 (通常,我认为$ request-> user()是使用户退出的更好方法)。您还需要将这些字段添加到第一个post对象。
$post = new Post([
'caption' => $data['caption'],
'image' => $imagePath,
]);
//code in between should still be there
$request->user()->posts()->save($post);
答案 1 :(得分:1)
创建模型对象时,将完成post和标记之间的同步。此时,它实际上是将ID为null的模型与现有的tag-id进行同步,从而导致post_id在数据库中为空。
保存模型后执行$post->tags()->sync($request->tags, false);
即可。
答案 2 :(得分:1)
首先创建您的帖子
$post = auth()->user()->posts()->create([
'caption' => $data['caption'],
'image' => $imagePath,
]);
然后分配标签
$post->tags()->sync($request->tags, false);
另外,您可以尝试将tags()-> sync()与post()-> create()方法链接起来,但我尚未进行测试。
答案 3 :(得分:0)
是否尝试过使用链接到迁移文件的OnUpdate和onDelete方法?