如何在 laravel eloquent 中保存布尔值

2022-08-30 18:18:10

我在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');
    }
}

我有以下控制器方法,该方法在提交前端中的表单时运行:

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

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

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

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

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

enter image description here

现在如何使它使得当复选框被选中时,被保存,当复选框未选中时,中的值将保留在?10


答案 1

勾选复选框后,其值将出现在发布的数据中。当它未被勾选时,它的价值不存在。这意味着当您这样做时,它将仅包含已勾选的复选框。因此,在您的情况下,如果您未选中所有3个复选框,则可以生成一个空数组(假设没有发布其他字段)。$request->all()$request->all()

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

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

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

迁移:

$table->boolean('favicon')->default(0);

形式:

{!! Form::checkbox('title', '1'); !!}

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

但是,当我编写处理存储的方法时,我更喜欢更明确。

$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();

答案 2

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

protected $fillable = [
    'favicon',
    'title',
    'image-optimization'
];

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

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

推荐