【问题标题】:How to save boolean values in laravel eloquent如何在 laravel eloquent 中保存布尔值
【发布时间】:2017-04-25 12:29:16
【问题描述】:

我在 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 ??

【问题讨论】:

标签: php laravel checkbox laravel-5 eloquent


【解决方案1】:

使用 VUE,您可以这样做:

将此行添加到您的表格中

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 不错的解决方案!非常感谢。
    【解决方案3】:

    您可以检查复选框是否设置为isset($request-&gt;favicon)empty($request-&gt;favicon)-&gt;has('favicon')

    public function store(CreateArticleRequest $request) {
        foreach (['favicon', 'title', 'image-optimization'] as $box) {
            $request($box) = $request->has($box);
        }
        Article::create($request->all());
        return redirect('articles');
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      您可以通过多种方式使其工作,以便在选中复选框时保存 1 或在未选中复选框时保存 0。在您的场景中,最简单的方法是将每个复选框的值设置为 1 并在迁移中明确设置默认值,即

      迁移:

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

      表格:

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

      这样,当勾选标题复选框时,$request-&gt;all()返回包含项目'title' =&gt; '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();
      

      【讨论】:

        猜你喜欢
        • 2020-06-11
        • 2022-08-18
        • 2015-06-04
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2020-02-19
        • 2019-09-27
        • 2017-08-22
        相关资源
        最近更新 更多