Php 如何从Laravel 7中包含多个图像的帖子中删除单个图像

Php 如何从Laravel 7中包含多个图像的帖子中删除单个图像,php,laravel,Php,Laravel,使用Laravel7,我可以上传、添加和删除任务中的所有图像(如果是博客,则发布),但我不清楚如何从任务视图(单个发布视图)中删除单个图像。我正在使用资源控制器执行任务,但我认为我需要一个不同的功能。我在同一个TasksController中创建了一个,关于资源控制器,我为它创建了一个删除路由。我的应用程序抱怨,当我单击单个图像删除按钮时,我试图获取非对象的属性“task\u name”。我不知道该怎么做,也不知道我是否需要创建一个图像控制器(我目前没有使用它)。我会告诉你我在尝试什么,也许,你

使用Laravel7,我可以上传、添加和删除任务中的所有图像(如果是博客,则发布),但我不清楚如何从任务视图(单个发布视图)中删除单个图像。我正在使用资源控制器执行任务,但我认为我需要一个不同的功能。我在同一个TasksController中创建了一个,关于资源控制器,我为它创建了一个删除路由。我的应用程序抱怨,当我单击单个图像删除按钮时,我试图获取非对象的属性“task\u name”。我不知道该怎么做,也不知道我是否需要创建一个图像控制器(我目前没有使用它)。我会告诉你我在尝试什么,也许,你可以告诉我,如果我不正确,或者分享一些建议。首先,这里是我的web.php:

<?php

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

Route::get('/users', 'UsersController@index');
Route::delete('delete-image', 'TasksController@delete')->name('delete-image');

Route::resource('tasks', 'TasksController');
Route::resource('users', 'UsersController');

在我的show.blade.php中,它将充当单个post视图:

<div class="col-md-12">
                <h5>Images</h5>
                <hr />
                  <div class="row">
                      @if($task->images->count()>0)

                          @for($i=0; $i < count($images = $task->images()->get()); $i++)
                          <div class="col-lg-4 col-md-6 col-sm-12">
                            <a href="delete-image" class="badge badge-danger p-2 mb-3">Delete</a><br>
                            <a href="#" class="thumbnail" data-toggle="modal" data-target="#lightbox"><img class="w-50 mb-2" src="/storage/upload/{{ $images[$i]['name'] }}" alt=""></a>

                        </div>

                          @endfor
                          @else
                              <p>No images found</p>
                      @endif
                  </div>
                <br />
              </div>
在我的Task.php模型中:

public function images()
    {
        // return $this->hasMany('App\Image');
        return $this->hasMany(Image::class);
    }

    public static function boot()
    {
        parent::boot();
        self::deleting(function ($task) {
            foreach ($task->image ?: [] as $image) {
                $image->delete();
            }
        });
    }

如果我遗漏了什么,请告诉我,这样我可以修改我的问题。我真的很感谢你在这方面的帮助,因为我已经落后一周了。提前谢谢。

您需要传递特定的图像id才能删除它。我还对更干净的代码做了一些更改:

<div class="row">
        @forelse($task->images as $image)
            <div class="col-lg-4 col-md-6 col-sm-12">
            <a href="delete-image/{{$image->id}}" class="badge badge-danger p-2 mb-3">Delete</a><br>
            <a href="#" class="thumbnail" data-toggle="modal" data-target="#lightbox">
                <img class="w-50 mb-2" src="/storage/upload/{{ $image->name }}" alt=""></a>
        </div>
        @empty
            <p>No images found</p>
        @endforelse
</div>
然后,可以通过以下方式访问控制器上的变量:

public function delete($image_id, Request $request)
{
    # code...
}

谢谢你,哈西尔。我更接近了。我在控制器中找不到id。有什么建议吗?这条路一直把我带到404。我可以看到带有图像id的url:<代码>公共函数delete(Image$Image){///$task=task::with('images')->findOrFail($id);$images=Image::find();foreach($images as$Image){dd($Image->id);Storage::disk('public')->delete('upload/'.$Image->name);}$images->delete();返回重定向('home')->带有('success','Image Deleted');}希望这对@ErikJamesRoblesThank you@Hásil有帮助。我按照你的建议更改了代码,但我仍然得到一个404页面,好像找不到控制器似的。两件事,我想知道,一件事,图像与其任务有关系,这就是为什么或者如果我的图像表中没有图像id。我很困惑。抱歉一个有害程序。谢谢@Hásil。我从磁盘和数据库中得到了要删除的映像。唯一剩下的是,在实现了您建议的代码后,我看不到我的映像。如果我使用
name}>
我会得到错误`Property[name]此集合“”上不存在。有任何线索吗?再次感谢,$image对象不包含名称键,或者$image是一个数组。首先,dd($image)并检查名称是否存在,然后尝试$image['name']。另外,我建议使用laravel上可用的asset()函数获取准确的url.name)}“>
<div class="row">
        @forelse($task->images as $image)
            <div class="col-lg-4 col-md-6 col-sm-12">
            <a href="delete-image/{{$image->id}}" class="badge badge-danger p-2 mb-3">Delete</a><br>
            <a href="#" class="thumbnail" data-toggle="modal" data-target="#lightbox">
                <img class="w-50 mb-2" src="/storage/upload/{{ $image->name }}" alt=""></a>
        </div>
        @empty
            <p>No images found</p>
        @endforelse
</div>
Route::delete('delete-image/{image_id}', 'TasksController@delete')->name('delete-image');
public function delete($image_id, Request $request)
{
    # code...
}