【问题标题】:Laravel Patch Request doesn't update database tableLaravel 补丁请求不更新数据库表
【发布时间】:2020-04-28 22:39:09
【问题描述】:

对于我们的任务属性,我们有以下内容:task_id 作为主键,user_id、stage_id 和 project_id 作为外键,以布尔值和描述形式完成。我们的目标是显示项目下的任务,并通过选中它们旁边的复选框,它应该将它们标记为完成。问题是在我们的数据库中,“完成”状态没有改变。我们正在使用 PhpMyAdmin。我们有一个名为 ProjectTasksController 的单独控制器来处理逻辑,并在我们的 show.blade.php 视图中有一个表单来发送请求。任何帮助将不胜感激。

@extends('layouts.app')
@section('content')
<div class="display-3">{{$project->name}}</div>

<a class="nav-link" href="/projects/{{$project->project_id}}/edit"><i class="material-icons">edit</i></a>

@if ($project->image)
        <div class="row">
        <div class="col-12">
            <img src="{{ asset('storage/' . $project->image) }}" alt="...." class="img-thumbnail">
        </div>
        </div>
 @elseif(!$project->image)
 no image
@endif

@if ($project->tasks->count())
 <div>
     @foreach ($project->tasks as $task)
     <div>
     <form method="POST" action="/tasks/{{$task->task_id}}">
        {{method_field('PATCH')}} {{-- @method('PATCH') --}}
        @csrf
             <label class="checkbox {{$task->completed ? 'is_complete' : ''}} " for="completed">
                 <input type="checkbox" name="completed" onChange="this.form.submit()" {{$task->completed ? 'checked' : ''}} >
                 {{$task->description}}
             </label>
         </form>

        </div>
     @endforeach
 </div>
 @endif

@endsection
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Task;

class ProjectTasksController extends Controller{

public function update(Task $task)
{
    $task->update([
        'completed' => request()->has('completed')
    ]);

    return back();
}


}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $guarded = [];
    protected $primarykey = ['task_id'];
    protected $fillable = ['user_id','stage_id','project_id','completed','description'];
    public function stage(){

        return $this->belongsTo(Stage::class);

    }

    public function user(){

        return $this->belongsTo(User::class);

    }


    public function project(){

        return $this->belongsTo(Project::class);

    }

    }
{
_method: "PATCH",
_token: "ljiwu8bEtAkRqSUOXllmaRbSujavHNYNRJR5TMcy",
completed: "on"
}
Route::patch('/tasks/{task_id}', 'ProjectTasksController@update');

【问题讨论】:

    标签: php database laravel laravel-blade


    【解决方案1】:

    您的控制器方法不正确,Task $task 的提示只是Task 的一个实例,而不是集合或单个模型。而且您还没有在方法参数中指定您的Request $request 来完成这项工作request()-&gt;has('completed') .您需要通过以下方式编辑您的方法:

    public function update(Request $request,$task_id)
        {
            Task::find($task_id)->update([
                'completed' => $request->has('completed')
            ]);
    
            return back();
        }
    

    注意: $request-&gt;has('completed') 将返回Boolean;如果你想要准确的值,那么你需要检索为 $request-&gt;get('completed')

    【讨论】:

    • 感谢您完成任务!但是现在为了添加任务,它给了我们以下错误,我们稍微改变了路由和 show.blade.php 页面。你也可以帮助我们吗,我们真的被困住了,提前谢谢你!
    • public function store(Project $project) { //$project->addTask(request('description'));任务::create([ 'project_id' => $project->project_id, 'description'=>request('description'), 'user_id' => auth()->id(), ]);返回(); }
    • Route::resources(['projects'=> 'ProjectController', 'profile' => 'ProfileController', 'projectTask' => 'ProjectTasksController' ]);
    • @csrf

  • 这里是错误 SQLSTATE[23000]: 完整性约束违规: 1048 列 'project_id' 不能为空 (SQL: 插入到tasks (project_id, description, user_id, updated_at, created_at) 值 (, dadasdsadas, 1, 2020-01-11 17:59:32, 2020-01-11 17:59:32))
  • 【解决方案2】:

    如果要使用路由模型绑定,更新函数中的参数名称应与路由参数匹配:

    Route::patch('/tasks/{task}', 'ProjectTasksController@update');
    

    在任务模型中将protected $primaryKey = ['task_id]'; 替换为protected $primaryKey ='task_id'。它应该是一个字符串,而不是一个数组。

    【讨论】:

    • 当我们尝试这个时,它给了我们一个错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select * from tasks where @987654326 @ = 6 限制 1)
    • 当我们输入 task_id 时,它在浏览器中给我们这个错误,wheRequest URL: 127.0.0.1:8000/tasks/6 Request Method: POST Status Code: 302 Found Remote Address: 127.0.0.1:8000 Referrer Policy: no- referrer-when-downgraden 我们检查它
    • protected $primaryKey = [ 'task_id]'; 替换为protected $primaryKey ='task_id'。它应该是一个字符串,而不是一个数组。
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2015-07-17
    • 1970-01-01
    • 2019-04-18
    • 2015-09-15
    相关资源
    最近更新 更多