删除图像后如何删除基于外键的记录?

时间:2018-02-20 16:01:01

标签: php laravel eloquent

从我的图像表中删除记录后,我在tag_image表中留下了一条记录,该记录将不再存在的图像连接到标记。当我删除图像时,我想以某种方式删除该连接。

Table: images
Columns: id, Title, Path

Table: tags
Columns: id, name

Table: tag_image
Columns: image_id, tag_id

我的deleteImage功能:

public function deleteImage($imageId){
        $image = Image::where('id', $imageId)->first();
        if (!Auth::user()->hasRole('Admin')) {
            if (Auth::user() != $image->user){
                return redirect()->back();
            }
        } else if (Auth::user()->hasRole('Admin')) {
            $imageName = $image->file_name;
            $image->delete();
            Storage::delete('public/images/uploaded/'.$imageName);
            return redirect()->route('home');
        }
        $imageName = $image->file_name;
        $image->delete();
        Storage::delete('public/images/uploaded/'.$imageName);
        return redirect()->route('home');
    }

标签模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    public function images(){
        return $this->belongsToMany('App\Image', 'tag_image','tag_id','image_id');
    }
}

图片模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Image extends Model
{
    public function user(){
        return $this->belongsTo('App\User');
    }

    public function tags(){
        return $this->belongsToMany('App\Tag','tag_image','image_id','tag_id');
    }
}

2 个答案:

答案 0 :(得分:1)

你应该在删除之前分开

$image = Image::where('id', $imageId)->first();
$image->tags()->detach();

$image->tags()->detach($tag_id);

阅读材料

Inserting and Updating Related Models

答案 1 :(得分:1)

如果您正在使用迁移,则可以使用关系模型:

$table->foreign('image_id')
      ->references('id')->on('image')
      ->onDelete('cascade');

甚至可以直接在数据库中定义删除级联关系。

ALTER TABLE image_tag
   ADD CONSTRAINT `fk_image`
   FOREIGN KEY (`image_id`)
   REFERENCES `image` (`id`)
   ON DELETE CASCADE

有关迁移的更多信息:

https://laravel.com/docs/5.6/migrations

相关问题