laravel5:将复选框存储为tinyint(4)或boolean在mysql/DB中


laravel5: Storing of checkboxes as tinyint(4) or boolean in mysql/DB

寻找以下函数的更好执行,特别是处理复选框。

    /**
 * Update the specified resource in storage.
 *
 * @param  int  $id
 * @return Response
 */
public function update(CreateUserRequest $request, $id)
{       
    $user = User::find($id);
    //TODO should be else where?
    $input = $request->all();
    if(isset($input['status'])) $input['status'] = 1;
        else $input['status'] = 0;
    $user->fill($input)->save();        
    return redirect('admin/users');     
}

我认为你做得很好,但你可以测试状态的值为字符串'是'。未选中的复选框不会注册任何东西,本质上是一样的。假设你的复选框输入value="yes",那么:

$input = $request->all();
if($input['status'] === 'yes') $input['status'] = 1;
else $input['status'] = 0;

无论如何,您都必须使用'else'来为未检查的情况定义一些值。这实际上只是您想要为选中的值使用的问题。您甚至可以将其设为1,但未检查的情况不会为0,您仍然需要这个条件来赋值它。

如果你想从你的控制器中获得逻辑,你可以尝试在DDL中将字段默认设置为0,然后在模型中实现mutator (setter):

class User extends Eloquent {
    public function setStatusAttribute($value)
    {
        $this->attributes['status'] = 1;
    }
}

这里的问题是,如果输入中没有status,则不会调用该函数,如果复选框未选中,则不会调用该函数。因此,如果用户设置和取消设置,它不会取消设置。

因此,据我所知,我们都会为控制器中的输入生成真值和假值,这是一种传统做法。您唯一真正的选择是您希望在表单中的输入上设置什么值。