【问题标题】:Update status in database using checkbox - Laravel使用复选框更新数据库中的状态 - Laravel
【发布时间】:2019-08-27 08:42:20
【问题描述】:

项目可以有不同的状态。使用复选框,我试图将项目的状态从请求 (1) 切换到接受 (2)。如果复选框未选中,则状态为 1,选中为 2。

当我选中复选框时,我得到了 419,但这通常与令牌有关,但我添加了一个 @csfr 字段。为什么数据库中的状态没有改变? 感谢您的帮助。

index.blade.php(所有项目汇总)

 @foreach ($projects as $project)

        <tbody>
            <tr>
                <form action="/projects/plan" method="post" id="statusForm">
                 @csrf
                    <input name="id" type="hidden" value="{{$project->id}}">
                    <td>
                        <input type="hidden" value="{{$project->status}}" name="status"> 
                        <input {{isset($project['status']) && $project['status'] == '2' ? 'checked' : ''}} 
                                value="{{$project->status}}" type="checkbox" name="status" 
                                onchange="document.getElementById('statusForm').submit()"
                        >
                    </td>
                </form>
                <td>{{$project->applicant_name}}</td>
                <td>{{$project->project_name}}</td>
                <td><a href="/events/{{$projects->id}}/edit" class="btn btn-secondary btn-sm" role="button">Project Details</a></td>
            </tr>
        </tbody>

    @endforeach

Project.php(更新状态的函数)

    const STATUS_requested  = 1;
    const STATUS_ACCEPTED   = 2;

    public function updateStatus( $status )
    {
        $this->update([
            'status'    => $status
        ]);
        $this->refresh();
        return $this;
    }

    public function projectAccept()   { 

        return $this->updateStatus( self::STATUS_ACCEPTED );   

    }

ProjectsController.php(dd('hello') 没有打印,好像数据没有发送到这个资源)

    public function plan(Request $request)
    {
        dd('hello');
        Event::find($request->id)->projectAccept();
        return Project::STATUS_ACCEPTED;
    }

web.php

// Update status project
Route::post('/projects/plan',                 'ProjectsController@plan');

【问题讨论】:

  • 您正在通过对象语法和数组语法访问Project 模型上的status 属性,是否正确?
  • 是的。我找到了这个,但我不知道这是否是最好的方法。
  • 很难理解您的代码...我看不到您如何使用发布的复选框来更新状态?你有这么多的功能和文件只需更新 1 或 2..
  • 我认为这会更容易,因为我想稍后尝试添加更多状态。我应该尝试减少功能吗?但是为什么我的代码不能访问我的资源,我在 web.php 中定义的资源路由不正确?

标签: php laravel checkbox resources status


【解决方案1】:

首先,当您有多个具有相同 ID 的 DOMS 时,您不能通过 ID document.getElementById('statusForm').submit() 进行选择。

把你的循环改成这样的

@foreach ($projects as $project)
    <tbody>
        <tr>
             <td>
                 <form action="/projects/plan" method="post" id="statusForm{{$project->id}}">
                @csrf
                 <input name="id" type="hidden" value="{{$project->id}}">
                 <input {{isset($project['status']) && $project['status'] == '2' ? 'checked' : ''}} 
                     value="2" type="checkbox" name="status" 
                     onchange="document.getElementById('statusForm{{$project->id}}').submit()"
                 >
                 </form>
            </td>
            <td>{{$project->applicant_name}}</td>
            <td>{{$project->project_name}}</td>
            <td><a href="/events/{{$projects->id}}/edit" class="btn btn-secondary btn-sm" role="button">Project Details</a></td>
        </tr>
    </tbody>

@endforeach

现在,复选框只会在选中时以表单形式发送,因此该输入不需要变量值

<input {{isset($project['status']) && $project['status'] == '2' ? 'checked' : ''}} 
    value="2" type="checkbox" name="status" 
    onchange="document.getElementById('statusForm{{$project->id}}').submit()"
>

最后,当你恢复输入status时,为未选中的设置一个默认值(你可以用这个删除隐藏的输入)。或者像您所做的那样,使用每次发送的原始值设置一个隐藏输入。两种解决方案都很完美。

public function plan(Request $request)
{
    $status = $request->input('status', Project::STATUS_requested);
    Event::find($request->id)->projectAccept();
    return Project::STATUS_ACCEPTED;
}

这样,如果它被选中,它将是 2(在请求中),如果没有,它将是默认值的 1。

【讨论】:

  • 非常感谢。一个专门用于默认和多个 DOM 的。但我仍然遇到同样的错误。我的资源无法访问你知道是什么原因造成的吗?
  • @Nemo 您是否拦截了提交并通过 ajax 发送?在这种情况下,当您检查检查器中的网络选项卡时会得到什么结果?还是您的页面没有被重定向?你改变了&lt;form&gt;标签的位置,因为我改变了它(在&lt;td&gt;标签内)?
  • 我通过我的资源路由将表单发送到没有 ajax 请求的控制器。在网络选项卡中,我得到了 POST /projects/plan 419
  • 检查namespace 中的ProjectsController.php 是否正确。您收到的是 404 还是错误?
  • 我有一个错字,所以它找不到控制器。非常感谢,现在可以使用了。它还有助于将
    放在 标记内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2016-11-30
相关资源
最近更新 更多