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
、 そのようです:
チェックボックスがチェックされたときに1
が保存され、チェックボックスをオフのままにすると、値が0
??
チェックボックスにチェックを入れると、その値が投稿されたデータに存在します。チェックされていない場合、値は存在しません。つまり、$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();
_
$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>
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');
}
Laravelでミューテーターを使用できます。このリンクを使用すると、アイデアが得られます:-