如何在laravel eloquent中保存布尔值

Ale*_*nik 12 php checkbox laravel eloquent laravel-5

我在Laravel进行了以下迁移:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class QualityCheckTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('quality_check', function (Blueprint $table) {
            $table->increments('id');
            $table->boolean('favicon');
            $table->boolean('title');
            $table->boolean('image-optimization');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('quality_check');
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下控制器方法,当提交frontEnd中的表单时运行:

public function store(CreateArticleRequest $request) {
        // $input = Request::all();
        Article::create($request->all());
        return redirect('articles');
    }
Run Code Online (Sandbox Code Playgroud)

我的表格看起来像,所以:

{!! Form::open([ 'action' => 'QualityCheckController@validateSave' , 'class'=>'quality-check-form' , 'method' => 'POST' ]) !!}

        <div class="input-wrpr">
            {!! Form::label('favicon', 'Favicon') !!}
            {!! Form::checkbox('favicon', 'value' ); !!}
        </div>

        <div class="input-wrpr">
            {!! Form::label('title', 'Page Title') !!}
            {!! Form::checkbox('title', 'value'); !!}
        </div>

        <div class="input-wrpr">
            {!! Form::label('image-optimization', 'Image Optimization') !!}
            {!! Form::checkbox('image-optimization', 'value'); !!}
        </div>

        {!!  Form::submit('Click Me!') !!}

    {!! Form::close() !!}
Run Code Online (Sandbox Code Playgroud)

因此,当方法运行时,复选框的值将保存到数据库中.

截至目前,所有条目都显示为0,如下所示:

在此输入图像描述

现在如何使其在选中复选框时1保存,当未选中复选框时,值保留在0??

Jon*_*hon 14

勾选复选框后,其值将显示在已过帐的数据中.当它被取消时,它的值不存在.这意味着当您这样做时$request->all(),它将仅包含已勾选的复选框.因此,在您的情况下,如果您保留所有3个未选中的复选框,则$request->all()可能会产生一个空数组(假设没有其他字段被发布).

当您运行Article::create($request->all());时没有勾选复选框时,您实际上将传递一组空数据,这意味着您的数据库将填充您未提供的字段的默认值.

由于您没有在迁移中提供默认值,因此MySQL将根据字段类型猜测默认值应该是什么,在布尔值的情况下将是0.您可能会看到一些警告/错误.

有很多方法可以让它工作,以便1在勾选复选框或未勾选时保存a 0.您方案中最简单的方法是将每个复选框的值设置为1并在迁移中明确设置默认值,即

移民:

$table->boolean('favicon')->default(0);
Run Code Online (Sandbox Code Playgroud)

形成:

{!! Form::checkbox('title', '1'); !!}
Run Code Online (Sandbox Code Playgroud)

这样,当勾选标题复选框时,您$request->all()将返回包含项目的数组,并将其'title' => '1'保存在数据库中.根据您的迁移,所有未打开的框默认为0.

但是,当我编写处理商店的方法时,我更喜欢更明确.

$article = new Article();
$article->title = $request->has('title'); // Will set $article->title to true/false based on whether title exists in your input
// ...
$article->save();
Run Code Online (Sandbox Code Playgroud)


小智 6

您是否记得$fillable在文章模型中将它们传递给数组?

protected $fillable = [
    'favicon',
    'title',
    'image-optimization'
];
Run Code Online (Sandbox Code Playgroud)

并作为复选框的旁注.您可以使用相同的名称创建隐藏的输入,并将其设置为false.这样,如果取消选中该复选框,它将为false,但如果选中它,它将返回true,因为它是最后一个值:

    <div class="input-wrpr">
        {!! Form::label('title', 'Page Title') !!}
        {!! Form::hidden('title', false); !!}
        {!! Form::checkbox('title', 'value'); !!}
    </div>
Run Code Online (Sandbox Code Playgroud)


Dut*_*nce 6

使用 VUE 你可以这样做:

将此行添加到您的表中

$table->boolean("image-optimization")->default(0);
Run Code Online (Sandbox Code Playgroud)

将其添加到您的模型中,它将修改插入数据库中的值

protected $casts = ['image-optimization' => 'boolean'];
Run Code Online (Sandbox Code Playgroud)

您不必使用此方法修改请求

文档: https: //laravel.com/docs/8.x/eloquent-mutators