web-dev-qa-db-fra.com

Comment sauvegarder les valeurs booléennes dans laravel éloquent

J'ai effectué la migration suivante à 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');
    }
}

J'ai la méthode de contrôleur suivante qui s'exécute lorsque le formulaire dans le frontEnd est soumis:

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

Ma forme ressemble, alors:

{!! 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() !!}

Ainsi, lorsque la méthode est exécutée, les valeurs des cases à cocher sont enregistrées dans la base de données.

À partir de maintenant, toutes les entrées s'affichent sous la forme 0, comme suit:

 enter image description here

Maintenant, comment faire en sorte que lorsque la case à cocher est cochée, 1 soit enregistré et que lorsque la case à cocher est décochée, la valeur en est laissée à 0 ??

8
Alexander Solonik

Lorsqu'une case à cocher est cochée, sa valeur est présente dans les données publiées. Quand il est décoché, sa valeur n'est pas présente. Cela signifie que lorsque vous exécuterez $request->all(), il ne contiendra que les cases à cocher qui ont été cochées. Donc, dans votre cas, si vous laissez les 3 cases à cocher non cochées, votre $request->all() pourrait générer un tableau vide (en supposant qu'aucun autre champ ne soit posté).

Lorsque vous exécutez Article::create($request->all()); sans les cases à cocher, vous lui transmettez essentiellement un ensemble de données vide, ce qui signifie que votre base de données va être renseignée avec les valeurs par défaut des champs que vous n'avez pas renseignés.

Puisque vous n'avez pas fourni de valeur par défaut dans votre migration, MySQL va deviner ce que la valeur par défaut devrait être basée sur le type de champ, qui dans le cas d'un booléen sera 0. Vous pouvez cependant voir quelques avertissements/erreurs.

Il existe de nombreuses façons de le faire fonctionner de manière à enregistrer un 1 quand une case à cocher est cochée ou un 0 quand elle n'est pas cochée. La méthode la plus simple de votre scénario consiste à définir la valeur de chaque case à cocher sur 1 et à définir explicitement les valeurs par défaut dans votre migration, c.-à-d.

Migration:

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

Forme:

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

Ainsi, lorsque la case à cocher de titre est cochée, votre $request->all() renvoie un tableau contenant un élément 'title' => '1' et celui-ci est enregistré dans votre base de données. Toutes les cases non cochées ont la valeur par défaut 0 selon votre migration.

Je préfère cependant être plus explicite lorsque j'écris ma méthode pour gérer le magasin.

$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

Avez-vous pensé à les transmettre dans le tableau $fillable du modèle d'article?

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

et en tant que note de bas de page concernant les cases à cocher. Vous pouvez simplement faire une entrée cachée avec le même nom et la rendre fausse. Ainsi, si la case à cocher est décochée, elle sera fausse, mais si elle est cochée, elle retournera la valeur true, car c'est la dernière valeur 

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

Vous pouvez vérifier si la case à cocher est définie avec isset($request->favicon) ou empty($request->favicon) ou ->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

Vous pouvez utiliser des mutateurs dans le Laravel. Utilisez ce lien et vous aurez l'idée: -

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

1
Shubh