Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尝试删除带有多个图像的帖子时,为foreach()提供的Laravel 7参数无效_Php_Laravel - Fatal编程技术网

Php 尝试删除带有多个图像的帖子时,为foreach()提供的Laravel 7参数无效

Php 尝试删除带有多个图像的帖子时,为foreach()提供的Laravel 7参数无效,php,laravel,Php,Laravel,我正在运行Laravel 7,并且有一个任务列表(如果是博客,则为帖子),我需要确保在删除任务时,删除数据库和光盘中的所有后续图像。单击delete按钮时,页面抛出一个错误:为foreach()提供的参数无效。。 不幸的是,这是一个模糊的错误,可能由多种原因造成。我希望有人能看看我的代码,看看我是否遗漏了什么。我对拉威尔比较陌生,所以追踪这个问题不仅仅是一个挑战。比你先帮我解决这个问题。 在我的Task.php模型中,我有: <?php namespace App; use Illum

我正在运行Laravel 7,并且有一个任务列表(如果是博客,则为帖子),我需要确保在删除任务时,删除数据库和光盘中的所有后续图像。单击delete按钮时,页面抛出一个错误:
为foreach()提供的参数无效。
。 不幸的是,这是一个模糊的错误,可能由多种原因造成。我希望有人能看看我的代码,看看我是否遗漏了什么。我对拉威尔比较陌生,所以追踪这个问题不仅仅是一个挑战。比你先帮我解决这个问题。 在我的
Task.php
模型中,我有:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Image;
use Illuminate\Support\Facades\Storage;


class Task extends Model
{
    protected $fillable = [
        'task_name', 'task_priority', 'task_assigned_to', 'task_assigned_by', 'task_description', 'task_to_be_completed_date', 'task_status',
        'task_notes'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

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

    public static function boot()
    {
        parent::boot();
        self::deleting(function ($task) {
            foreach ($task->images as $image) {
                $image->delete();
            }
        });
    }
}
在我的
TasksController.php
中,(这里的所有代码都是为了防止某些东西引起冲突),这里是我所拥有的:

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Task;
    use App\Image;
    
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\File;
    use Illuminate\Support\Facades\Storage;
    
    
    class TasksController extends Controller
    {
        public function index()
        {
            $tasks = Task::orderBy('created_at', 'desc')->paginate(10);
            return view('/tasks')->with('tasks', $tasks);
        }
        public function create()
        {
            return view('tasks.create');
        }
    
    
        public function store(Request $request)
        {
            $this->validate($request, [
                'task_name' => 'required',
                'task_description' => 'required',
            ]);
    
            // Create Task
            $user = Auth::user();
            $task = new Task();
            $data = $request->all();
            $task->user_id = $user->id;
            $task = $user->task()->create($data);
            if ($request->hasFile('images')) {
                $files = $request->file('images');
                foreach ($files as $file) {
                    $name = time() . '-' . $file->getClientOriginalName();
                    $name = str_replace(' ', '-', $name);
                    $file->move('task-images', $name);
                    $task->image()->create(['name' => $name]);
                    $images = new Image;
                    $images->name = $name;
                }
            }
            $task->task_name = $request->input('task_name');
            $task->task_description = $request->input('task_description');
            $task->task_priority = $request->input('task_priority');
            $task->task_assigned_by = $request->input('task_assigned_by');
            $task->task_assigned_to = $request->input('task_assigned_to');
            $task->task_to_be_completed_date = $request->input('task_to_be_completed_date');
            $task->task_notes = $request->input('task_notes');
            $task->task_status = $request->task_status;
            $task->save();
    
    
    
            return redirect('/home')->with('success', 'Task Created');
        }
        public function edit($id)
        {
            $task = Task::find($id);
            return view('tasks.edit', ['task' => $task]);
        }
        public function update(Request $request, $id)
        {
    
            $this->validate($request, [
                'task_name' => 'required',
                'task_description' => 'required',
            ]);
    
    
            $task = Task::find($id);
            $task->task_name = $request->input('task_name');
            $task->task_description = $request->input('task_description');
            $task->task_priority = $request->input('task_priority');
            $task->task_assigned_by = $request->input('task_assigned_by');
            $task->task_assigned_to = $request->input('task_assigned_to');
            $task->task_to_be_completed_date = $request->input('task_to_be_completed_date');
            $task->task_notes = $request->input('task_notes');
            $task->task_status = $request->input('task_status');
            if ($request->hasFile('images')) {
                $files = $request->file('images');
                foreach ($files as $file) {
                    $name = time() . '-' . $file->getClientOriginalName();
                    $name = str_replace(' ', '-', $name);
                    $file->move('task-images', $name);
                    $task->image()->create(['name' => $name]);
                }
            }
            $task->update();
            return redirect('/home')->with('success', 'Task Updated');
        }
        public function show($id)
        {
            $task =  Task::find($id);
            return view('tasks.show')->with('task', $task);
        }
        public function destroy($id)
        {
            $task = Task::findOrFail($id);
            // dd($task);
            $task->delete();
            return redirect('home')->with('success', 'Task Deleted');
        }
    }
And in the home page where I am calling the delete function, `home.blade.php`, I have:
@extends('layouts.master')

@section('content')
<div class="custom-container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            @include('layouts.includes.messages')
            <div class="card w-100">
                <div class="card-header text-white" style="background-color: #605ca8;">
                  <h3 class="card-title">Tasks</h3>
                  <div class="card-tools">
                    <a href="tasks/create" class="btn btn-success">
                      <i class="fas fa-tasks"></i> Add New Task
                    </a>
                  </div>
                </div>
                <!-- /.card-header -->
            </div>
            <div class="row">
                <div class="col-12">
                  <div class="card">
                    <div class="card-header">
                      <h3 class="card-title">Ongoing Tasks</h3>

                      <div class="card-tools">
                        <div class="input-group input-group-sm" style="width: 150px;">
                          <input type="text" name="table_search" class="form-control float-right" placeholder="Search">

                          <div class="input-group-append">
                            <button type="submit" class="btn btn-default"><i class="fas fa-search"></i></button>
                          </div>
                        </div>
                      </div>
                    </div>
                    <!-- /.card-header -->
                    <div class="card-body table-responsive p-0">
                      <table class="table table-hover text-nowrap">
                        <thead>
                          <tr>
                            <th>Task</th>
                            <th>Priority</th>
                            <th>Assigned To</th>
                            <th>Test Environment Date</th>
                            <th>Status</th>
                            <th>Action</th>
                          </tr>
                        </thead>
                        <tbody>
                            @if($tasks->count() > 0)
                            @foreach($tasks as $task)
                          <tr>
                            <td><a href="/tasks/{{$task->id}}">{{ $task->task_name }}</a></td>
                          <td>{{ $task->task_priority }}</td>
                          <td>{{ $task->task_assigned_to }}</td>
                            <td>{{$task->task_to_be_completed_date }}</td>
                            <td>{{ $task->task_status }}</td>
                            <td>
                                <a href="tasks/{{$task->id}}/edit" class="btn btn-primary btn-sm mr-2">
                                    <i class="fa fa-edit"></i> Edit
                                  </a>

                                  <form action="tasks/{{$task->id}}" method="POST" style="display: inline" class="">
                                    @csrf
                                    @method('DELETE')
                                  <button type="submit" class="btn btn-sm btn-danger ml-1 mr-1">
                                    <i class="fa fa-trash"></i> Delete
                                  </button>
                                </form>
                            </td>
                          </tr>
                         @endforeach
                         @else
                            <p class="ml-4 pt-2">No Tasks Found. Please Add one.</p>
                         @endif
                        </tbody>
                      </table>
                    </div>
                    <!-- /.card-body -->
                  </div>
                  <!-- /.card -->
                </div>
              </div>
        </div>
        {{ $tasks->links() }}
    </div>
</div>
@endsection

如果我遗漏了任何内容或代码,请告诉我,以便我可以编辑我的问题。再次提前感谢您帮助我解决此问题。

您正在尝试访问
任务
实例上名为
images
的属性,但没有名为
images
的属性,也没有名为
images
的关系,因此,将返回
null
$task->images==null
。您将您的关系命名为
image
而不是
images
,尽管
images
更为正确,因为此关系可以返回许多;复数的将关系的名称更改为
图像

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

或者通过其当前名称引用它:
$task->image

在循环中,如果使用的值不存在,请使用三元数组放置空数组。e、 x
foreach($files?:[]作为$file)
用于故障排除。如果在错误停止之前逐个执行,它将帮助您找出哪个循环有问题。GrumpyCrouton,这有助于解决错误,而且任务实际上已被删除,但图像仍保留在数据库中感谢lagbox和GrumpyCrouton。你的两个答案都有助于解决这个问题。非常感谢你。我会在几分钟内接受答案。
 'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            // 'root' => public_path('task-images'),
        ],
public function images()
{
    return $this->hasMany(Image::class);
}