it-swarm.com.de

So speichern Sie boolesche Werte in Laro eloquent

Ich habe folgende Migration in Laravel gemacht:

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

Ich habe die folgende Controller-Methode, die ausgeführt wird, wenn das Formular im FrontEnd gesendet wird:

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

Mein Formular sieht so aus:

{!! Form::open([ 'action' => '[email protected]' , '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() !!}

Wenn die Methode ausgeführt wird, werden die Werte der Kontrollkästchen in der Datenbank gespeichert.

Ab sofort werden alle Einträge als 0 angezeigt.

 enter image description here

Wie kann man nun so machen, dass 1 gespeichert wird, wenn das Kontrollkästchen aktiviert ist, und wenn das Kontrollkästchen deaktiviert ist, bleibt der Wert in 0?

8

Wenn ein Kontrollkästchen aktiviert ist, ist der Wert in den gebuchten Daten enthalten. Wenn das Kontrollkästchen deaktiviert ist, ist der Wert nicht vorhanden. Das heißt, wenn Sie $request->all() ausführen, enthält es nur die Kontrollkästchen, die angekreuzt wurden. Wenn Sie also in Ihrem Fall alle drei Kontrollkästchen nicht markieren, kann $request->all() ein leeres Array ergeben (vorausgesetzt, dass keine anderen Felder gepostet werden).

Wenn Sie Article::create($request->all()); ausführen, ohne dass die Kontrollkästchen aktiviert sind, übergeben Sie im Wesentlichen einen leeren Datensatz, dh Ihre Datenbank wird mit den Standardwerten für die Felder gefüllt, die Sie nicht angegeben haben.

Da Sie bei Ihrer Migration keinen Standardwert angegeben haben, wird MySQL erraten, welcher Standardwert auf dem Feldtyp basieren sollte. Bei einem booleschen Code ist dies 0. Es können jedoch einige Warnungen/Fehler angezeigt werden.

Es gibt viele Möglichkeiten, wie Sie dies erreichen können, so dass ein 1 gespeichert wird, wenn ein Kontrollkästchen aktiviert ist, oder 0, wenn es nicht aktiviert ist. Der einfachste Weg in Ihrem Szenario wäre, den Wert jedes Kontrollkästchens auf 1 zu setzen und explizit Standardwerte in Ihrer Migration festzulegen, d. H.

Migration:

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

Bilden:

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

Wenn das Kontrollkästchen für Titel aktiviert ist, wird auf diese Weise ein $request->all()-Array zurückgegeben, das ein Element 'title' => '1' enthält, und dieses wird in Ihrer Datenbank gespeichert. Alle nicht angekreuzten Kästchen sind gemäß Ihrer Migration standardmäßig auf 0 gesetzt.

Ich ziehe es jedoch vor, expliziter zu sein, wenn ich meine Methode zur Handhabung des Geschäfts schreibe.

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

Haben Sie daran gedacht, sie im $fillable-Array des Artikelmodells zu übergeben?

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

und als Nebenbote an die Checkbox-Sache. Sie können einfach eine verborgene Eingabe mit demselben Namen vornehmen und sie als falsch definieren. Auf diese Weise wird das Kontrollkästchen deaktiviert, wenn es nicht aktiviert ist. Wenn es jedoch aktiviert ist, wird der Wert true zurückgegeben, da es der letzte Wert ist 

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

Sie können prüfen, ob das Kontrollkästchen mit isset($request->favicon) oder empty($request->favicon) oder ->has('favicon') gesetzt ist:

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

Sie können Mutatoren in der Laravel verwenden. Verwenden Sie diesen Link und Sie erhalten die Idee: -

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

1
Shubh