我无法删除数据透视表中存在的记录 Table
Im unable to delete the records present int he Pivot Table
我有五个 tables:
- Post
- 类别
- 标签
- category_post
- post_tag
我遇到的问题是,如果我删除 post 那么它也应该删除所有 table 相关的 post 的所有关系.但是系统正在执行完全相反的操作,它只删除 post table.
中的 post
我找到了一个解决方案
$table->engine='InnoDB'
但我的问题还是一样
这是我的 Category_post 枢轴 Table
迁移
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->integer('post_id')->index()->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->integer('tag_id')->index()->unsigned();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$table->timestamps();
});
}
这就是我在控制器中所做的
public function destroy(Post $post)
{
$post=Post::find($post->id);
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}
我也试过这个
public function destroy(Post $post)
{
$post=Post::find($post->id);
$post->categories()->delete();
$post->tags()->delete();
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}
但得到了相同的结果
在 Laravel 中使用多对多关系的数据透视表时,您应该使用 Post 模型分离关联的标签和类别,而不是按照 docs[=28 删除它们=]
此外,您的控制器代码正在删除标签和类别 models,而不是会破坏附加到这些标签和类别的任何其他 post 的关联。
这是正确方法的示例
在您的 tags
迁移中
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->bigIncrements('id');
// Any other columns goes here
$table->timestamps();
});
Schema::create('post_tag', function (Blueprint $table) {
$table->bigInteger('post_id');
$table->bigInteger('tag_id');
// ensures a specific post can be associated a specific tag only once
$table->primary(['post_id', 'tag_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('post_tag');
Schema::dropIfExists('tags');
}
对类别迁移执行相同的操作
在 Eloquent 模型中指定 ManyToMany
关系
class Post extends Model
{
public function tags()
{
return $this->belongsToMany('App\Tag');
}
public function categories()
{
return $this->belongsToMany('App\Category');
}
}
现在将 tags/categories 与 post 关联时使用 attach
方法
$post = Post::create([]); // this is only sample code, fill your data as usual
$tag = Tag::create([]);
$category = Category::create([]);
// You can either attach by the model itself or ID
$post->tags()->attach($tag);
$post->categories()->attach($category);
最后,在销毁 Post 模型时,只需取消与标签和类别的关系,而不是像这样使用 detach
方法删除它们
public function destroy(Post $post)
{
$post->categories()->detach();
$post->tags()->detach();
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}
我有五个 tables:
- Post
- 类别
- 标签
- category_post
- post_tag
我遇到的问题是,如果我删除 post 那么它也应该删除所有 table 相关的 post 的所有关系.但是系统正在执行完全相反的操作,它只删除 post table.
中的 post我找到了一个解决方案
$table->engine='InnoDB'
但我的问题还是一样
这是我的 Category_post 枢轴 Table
迁移public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->integer('post_id')->index()->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->integer('tag_id')->index()->unsigned();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$table->timestamps();
});
}
这就是我在控制器中所做的
public function destroy(Post $post)
{
$post=Post::find($post->id);
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}
我也试过这个
public function destroy(Post $post)
{
$post=Post::find($post->id);
$post->categories()->delete();
$post->tags()->delete();
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}
但得到了相同的结果
在 Laravel 中使用多对多关系的数据透视表时,您应该使用 Post 模型分离关联的标签和类别,而不是按照 docs[=28 删除它们=]
此外,您的控制器代码正在删除标签和类别 models,而不是会破坏附加到这些标签和类别的任何其他 post 的关联。
这是正确方法的示例
在您的 tags
迁移中
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->bigIncrements('id');
// Any other columns goes here
$table->timestamps();
});
Schema::create('post_tag', function (Blueprint $table) {
$table->bigInteger('post_id');
$table->bigInteger('tag_id');
// ensures a specific post can be associated a specific tag only once
$table->primary(['post_id', 'tag_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('post_tag');
Schema::dropIfExists('tags');
}
对类别迁移执行相同的操作
在 Eloquent 模型中指定 ManyToMany
关系
class Post extends Model
{
public function tags()
{
return $this->belongsToMany('App\Tag');
}
public function categories()
{
return $this->belongsToMany('App\Category');
}
}
现在将 tags/categories 与 post 关联时使用 attach
方法
$post = Post::create([]); // this is only sample code, fill your data as usual
$tag = Tag::create([]);
$category = Category::create([]);
// You can either attach by the model itself or ID
$post->tags()->attach($tag);
$post->categories()->attach($category);
最后,在销毁 Post 模型时,只需取消与标签和类别的关系,而不是像这样使用 detach
方法删除它们
public function destroy(Post $post)
{
$post->categories()->detach();
$post->tags()->detach();
$post->delete();
return redirect('admin/post')->with('message','Deleted Sucessfully');
}