Laravel 5复选框只能'change'数据库输入一次
Laravel 5 checkbox can only 'change' database input once
我有一个项目列表,可以是 'completed' 或 'not completed' 带有复选框的项目。
现在,当项目未完成时,我使用复选框将其标记为已完成,其他方法也一样。
但是,例如:我有一个未完成的项目,我想将其标记为已完成,它可以工作,但后来我想再次将其标记为未完成,但它不会工作。它将保持 'finished' 而不是再次返回 'unfinished'。 我该如何解决这个问题?
控制器:
class ProjectController extends Controller
{
private $project;
public function __construct(Project $project){
$this->project = $project;
$this->project = $project
->with('user');
}
public function getUsersTotal () {
$project_users = DB::table('users')
->select('browser')
->groupBy('browser')
->get();
}
public function index()
{
$projects = Project::get();
return view('project.index', array('projects' => $projects));
}
public function create()
{
return view('project.create');
}
public function store(CreateProjectRequest $request, Project $project)
{
$project->create($request->all());
return redirect()->route('project.index');
}
public function show($id)
{
//
}
public function edit($id)
{
$project = $this->project->find($id);
return view('project.edit', ['project' => $project, 'id' => 'edit']);
}
public function update(CreateProjectRequest $request, $project)
{
$project = $this->project->find($project);
$project->fill($request->input())->save();
return redirect('project');
}
public function destroy($projectId)
{
$this->project->destroy($projectId);
return redirect('project');
}
}
HTML(Blade):
{!! Form::model($project, ["route"=> ['project.update',$project->id] , "method" => 'PATCH']) !!}
@include('project._form')
<div class="form-group {{ $errors->has('completed') ? 'has-error' : '' }}">
{!! Form::label('name', trans('common.completed'), ['class' => 'form-label']) !!}
{!! Form::checkbox('completed', '1', false, ['class' => '']) !!}
</div>
<br>
<div class="form-group">
{!! Form::submit( trans('common.edit'), ["class"=>"btn btn-primary"]) !!}
</div>
{!! Form::close() !!}
{!! delete_form(['project.destroy', $project->id]) !!}
您在复选框定义之前需要这个:
<input name='completed' type='hidden' value='0'>
{!! Form::checkbox('completed', '1', false, ['class' => '']) !!}
这将确保在未选中复选框时将值 0
发送到应用程序。
复选框的主要问题是,如果未选中复选框,它的值不在请求中。因此,在使用 create() 或不使用 update() 更改现有值时不会保存到数据库中。
我找到的最佳答案是创建一个 Form Request
验证器(如 this laracast on form validation 所示,并在 rules()
函数中检查复选标记是否存在,如果不存在,附加它. 优点是它适用于所有情况(创建新的和更新)并且它的代码位于一个地方而无需在您的表单中添加隐藏字段或在您的模型中添加设置器。只是一个干净的解决方案。
这个 post 展示了它是如何完成的:http://novate.co.uk/laravel-5-checkbox-processing/
示例:
$this->merge(['attribute_name' => $this->input('attribute_name', false)]);
我有一个项目列表,可以是 'completed' 或 'not completed' 带有复选框的项目。
现在,当项目未完成时,我使用复选框将其标记为已完成,其他方法也一样。
但是,例如:我有一个未完成的项目,我想将其标记为已完成,它可以工作,但后来我想再次将其标记为未完成,但它不会工作。它将保持 'finished' 而不是再次返回 'unfinished'。 我该如何解决这个问题?
控制器:
class ProjectController extends Controller
{
private $project;
public function __construct(Project $project){
$this->project = $project;
$this->project = $project
->with('user');
}
public function getUsersTotal () {
$project_users = DB::table('users')
->select('browser')
->groupBy('browser')
->get();
}
public function index()
{
$projects = Project::get();
return view('project.index', array('projects' => $projects));
}
public function create()
{
return view('project.create');
}
public function store(CreateProjectRequest $request, Project $project)
{
$project->create($request->all());
return redirect()->route('project.index');
}
public function show($id)
{
//
}
public function edit($id)
{
$project = $this->project->find($id);
return view('project.edit', ['project' => $project, 'id' => 'edit']);
}
public function update(CreateProjectRequest $request, $project)
{
$project = $this->project->find($project);
$project->fill($request->input())->save();
return redirect('project');
}
public function destroy($projectId)
{
$this->project->destroy($projectId);
return redirect('project');
}
}
HTML(Blade):
{!! Form::model($project, ["route"=> ['project.update',$project->id] , "method" => 'PATCH']) !!}
@include('project._form')
<div class="form-group {{ $errors->has('completed') ? 'has-error' : '' }}">
{!! Form::label('name', trans('common.completed'), ['class' => 'form-label']) !!}
{!! Form::checkbox('completed', '1', false, ['class' => '']) !!}
</div>
<br>
<div class="form-group">
{!! Form::submit( trans('common.edit'), ["class"=>"btn btn-primary"]) !!}
</div>
{!! Form::close() !!}
{!! delete_form(['project.destroy', $project->id]) !!}
您在复选框定义之前需要这个:
<input name='completed' type='hidden' value='0'>
{!! Form::checkbox('completed', '1', false, ['class' => '']) !!}
这将确保在未选中复选框时将值 0
发送到应用程序。
复选框的主要问题是,如果未选中复选框,它的值不在请求中。因此,在使用 create() 或不使用 update() 更改现有值时不会保存到数据库中。
我找到的最佳答案是创建一个 Form Request
验证器(如 this laracast on form validation 所示,并在 rules()
函数中检查复选标记是否存在,如果不存在,附加它. 优点是它适用于所有情况(创建新的和更新)并且它的代码位于一个地方而无需在您的表单中添加隐藏字段或在您的模型中添加设置器。只是一个干净的解决方案。
这个 post 展示了它是如何完成的:http://novate.co.uk/laravel-5-checkbox-processing/
示例:
$this->merge(['attribute_name' => $this->input('attribute_name', false)]);