web-dev-qa-db-ja.com

ブール値を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');
    }
}

FrontEndのフォームが送信されたときに実行される次のコントローラーメソッドがあります。

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

チェックボックスがチェックされたときに1が保存され、チェックボックスをオフのままにすると、値が0 ??

12

チェックボックスにチェックを入れると、その値が投稿されたデータに存在します。チェックされていない場合、値は存在しません。つまり、$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'_を含む配列を返し、これはデータベースに保存されます。すべてのチェックされていないボックスは、移行に従ってデフォルトで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();
_
14
Jonathon

$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>
6

isset($request->favicon)またはempty($request->favicon)または->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');
}
2
Alexey Mezenin

Laravelでミューテーターを使用できます。このリンクを使用すると、アイデアが得られます:-

https://laravel.com/docs/5.3/eloquent-mutators

0
Shubh