簡體   English   中英

使用復選框更新數據庫中的狀態-Laravel

[英]Update status in database using checkbox - Laravel

該項目可以具有不同的狀態。 選中該復選框,我試圖將項目的狀態從已請求(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');

首先,如果您有多個具有相同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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM