使用复选框更新数据库中的状态 - 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()
select。
将你的循环改成这样
@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。
项目可以有不同的状态。使用复选框,我试图将项目的状态从已请求 (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()
select。
将你的循环改成这样
@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。