如何在 laravel eloquent 中保存布尔值

新手上路,请多包涵

我在 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 ,如下所示:

在此处输入图像描述

现在如何做到这一点,当复选框被选中时, 1 被保存,当复选框未被选中时,值留在 0

原文由 Alexander Solonik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 431
2 个回答

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

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

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

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

移民:

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

形式:

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

这样,当标题复选框被打勾时,您的 $request->all() 返回一个包含项目的阵列 'title' => '1' 和此dateBase in your database均节省。根据您的迁移,所有未选中的框都默认为 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();

原文由 Jonathon 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 VUE,您可以这样做:

将此行添加到您的表中

$table->boolean("image-optimization")->default(0);

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

protected $casts = ['image-optimization' => 'boolean'];

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

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

原文由 DutchPrince 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题