Cómo guardar valores booleanos en laravel eloquent

4 minutos de lectura

He realizado la siguiente migración en 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');
    }
}

Tengo el siguiente método de controlador que se ejecuta cuando se envía el formulario en el frontEnd:

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

Mi formulario se parece a , entonces:

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

Entonces, cuando el método se ejecuta, los valores de las casillas de verificación se guardan en la base de datos.

A partir de ahora, todas las entradas se muestran como 0 Al igual que:

ingrese la descripción de la imagen aquí

Ahora, cómo hacer que cuando la casilla de verificación esté marcada, 1 se guarda y cuando la casilla de verificación se deja sin marcar, el valor en se deja en 0 ??

Cuando una casilla de verificación está marcada, su valor está presente en los datos publicados. Cuando no está marcado, su valor no está presente. Esto significa que cuando haces $request->all() contendrá solo las casillas de verificación que se marcaron. Entonces, en su caso, si deja las 3 casillas de verificación sin marcar, su $request->all() podría generar una matriz vacía (suponiendo que no se publiquen otros campos).

cuando corres Article::create($request->all()); sin casillas de verificación marcadas, esencialmente le pasaría un conjunto de datos vacío, lo que significa que su base de datos se completará con los valores predeterminados para los campos que no proporcionó.

Dado que no proporcionó un valor predeterminado en su migración, MySQL adivinará cuál debería ser el valor predeterminado en función del tipo de campo, que en el caso de un valor booleano será 0. Sin embargo, es posible que vea algunas advertencias/errores.

Hay muchas maneras de hacer que esto funcione para que un 1 se guarda cuando se marca una casilla de verificación o 0 cuando no está marcada. La forma más fácil en su escenario sería establecer el valor de cada casilla de verificación para que sea 1 y configure explícitamente valores predeterminados en su migración, es decir

Migración:

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

Forma:

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

De esta manera, cuando la casilla de verificación del título esté marcada, su $request->all() devuelve una matriz que contiene un elemento 'title' => '1' y esto se guarda en su base de datos. Todas las casillas sin marcar están predeterminadas en 0 según su migración.

Sin embargo, prefiero ser más explícito cuando escribo mi método para manejar la tienda.

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

¿Te has acordado de pasarlos en el $fillable matriz en el modelo de artículo?

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

y como nota al margen de las casillas de verificación. Simplemente puede hacer una entrada oculta con el mismo nombre y hacerla falsa. De esa forma, si la casilla de verificación no está marcada, será falso, pero si está marcada, devolverá verdadero, ya que es el último valor:

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

  • ¡Buena solución! Muchas gracias.

    – Chris

    28 de diciembre de 2019 a las 17:58

Con VUE puedes hacerlo así:

Añade esta línea a tu tabla

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

Agregue esto a su modelo, modificará el valor insertado en la base de datos.

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

No tienes que modificar la solicitud con este método.

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

Avatar de usuario de Alexey Mezenin
Alexey Mezenin

Puede verificar si la casilla de verificación está configurada con isset($request->favicon) o empty($request->favicon) o ->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');
}

¿Ha sido útil esta solución?