Laravel |删除功能-如何从日历事件中删除照片

时间:2018-11-25 19:01:36

标签: laravel

如何在编辑日历的事件视图中从日历的事件中删除照片?在事件列表中,我确实删除了方法,并且该方法有效。现在,当我尝试在edit.blade.php中执行相同操作时,它会显示错误:

Call to a member function photos() on null

我有两个表,一个日历与多张照片有关系,文件上传有效,但是我停留在编辑部分。

看看我的控制器功能:

public function deletePhoto(CalendarRepository $calRepo, $id)
    {
        $calendars = $calRepo->find($id);
        $calendars->photos($id)->delete();
        return redirect()->action('CalendarController@edit');
    }

这是edit.blade.php的片段:

<div class="form-group">
<label for="photo">Photo:</label>
  <div class="row">
      @foreach(($calendar->photos) as $photo)
           <div class="col-md-3">
                <div class="admin-thumbnail">
                      <img class="img-responsive" src="/storage/{{ $photo->filename }}" style="width:100px; height:auto;"/>
                </div>
                <a href="{{ URL::to('calendar/deletePhoto/' . $photo->id ) }}" onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
          </div>
      @endforeach
      </div>
</div>

我需要从“照片”表中删除照片,然后重定向到edit.blade.php(关于日历的特定事件ID)

感谢您的帮助。


编辑:

<div class="card-body">
    <form action="{{ action ('CalendarController@editStore')}}" method="POST" enctype="multipart/form-data">
         <input type="hidden" name="_token" value="{{csrf_token() }}"/>
         <input type="hidden" name="id" value="{{ $calendar->id }}"/>
         <input type="hidden" name="_token" value="{{csrf_token() }}"/>
         <div class="form-group">
             <label for="photo">Photo:</label>
                   <div class="row">
                        @foreach(($calendar->photos) as $photo)
                             <div class="col-md-3">
                                  <div class="admin-thumbnail">
                                       <img class="img-responsive" src="/storage/{{ $photo->filename }}"/>
                                  </div>
                                  <form method="POST" action="{{ route('photo.delete', ['calendar' => $calendar, 'photo' => $photo]) }}">
                                        @csrf
                                        @method("DELETE")
                                        <a onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
                                  </form>
                            </div>
                        @endforeach
                   </div>
                </div>
            <div class="form-group">
                 <label for="header">Header</label> 
                 <input type="text" class="form-control" name="header" value="{{ $calendar->header }}"/>
            </div>
            <div class="form-group">
                 <label for="description">Description</label>
                 <input type="text" class="form-control" name="description" value="{{ $calendar->description }}"/>
            </div>
            <div class="form-group">
                <label for="date">Date</label>
                <input type="date" class="form-control" name="date" value="{{ $calendar->date }}"/>
            </div>
            <input type="submit" value="Save" class="btn btn-primary"/>
      </form>
</div>

1 个答案:

答案 0 :(得分:1)

您使用相同的$id查找照片和日历实例。 不建议您使用GET请求删除资源,因此更好的方法是在您的路由中添加以下内容:

Route::delete('photo/{photo}', 'PhotosController@delete')->name('photo.delete');

然后在您的视图中,您应该在按钮周围加上一个窗体,例如:

<form method="POST" action="{{ route('photo.delete', $photo) }}">
@csrf
@method("DELETE")
<a onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
</form>

然后,如果用户接受删除照片,则JS中的confirm函数应提交表单。还要记住,在Confirm函数中默认将false返回为默认值,因此默认情况下它不会提交表单。

您的控制器将是:

public function delete(Photo $photo)
{   
    $photo->delete();
    return redirect()->back();
}

---编辑

Route::delete('calendar/{calendar}/photo/{photo}', 'CalendarController@deletePhoto')->name('photo.delete');

,表单中的操作可以是:

{{ route('photo.delete', ['calendar' => $calendar, 'photo' => $photo]) }}

控制器中的方法:

public function deletePhoto(Calendar $calendar, Photo $photo)
{   
    $calendar->photos()->where('id', $photo->id)->delete();
    return redirect()->action('CalendarController@edit');
}