Laravel 5复选框只能“更改”一次数据库输入

时间:2015-05-19 08:10:22

标签: php html laravel blade

我有一个项目列表,可以通过复选框“完成”或“未完成”。

现在,当一个项目没有完成时,我使用复选框标记它已完成,同样的方式可以解决它。

但是后来例如:我有一个未完成的项目,我希望标记为完成它的工作,但后来我想再次标记为未完成,并且不会工作。它将保持“完成”而不是再次回到“未完成”。我该如何解决这个问题?

控制器:

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(刀片):

{!! 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]) !!}

2 个答案:

答案 0 :(得分:3)

您需要在复选框定义之前使用此功能:

<input name='completed' type='hidden' value='0'>
{!! Form::checkbox('completed', '1', false, ['class' => '']) !!}

这将确保在未选中复选框时将0的值发送到应用程序。

答案 1 :(得分:1)

复选框的主要问题是,如果取消选中该复选框,则其值不在请求中。因此,在使用create()或不使用update()更改现有值时,不会保存到数据库。

我找到的最佳答案是创建一个Form Request验证程序(如this laracast on form validation所示,并在rules()函数检查中是否存在复选标记,如果没有,请附加它。优点是它适用于所有情况(创建新的和更新),并且它的代码位于一个地方,而不会在模型中添加隐藏字段或模型中的设置器。只是一个干净的解决方案。

这篇文章展示了它是如何完成的:http://novate.co.uk/laravel-5-checkbox-processing/

示例:

$this->merge(['attribute_name' => $this->input('attribute_name', false)]);