如何在 laravel eloquent 中保存布尔值
Posted
技术标签:
【中文标题】如何在 laravel eloquent 中保存布尔值【英文标题】:How to save boolean values in laravel eloquent 【发布时间】:2017-04-25 12:29:16 【问题描述】:我在 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');
我有以下在前端表单提交时运行的控制器方法:
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
??
【问题讨论】:
你可以在 Laravel 中使用 mutators。使用这个链接,你会明白的:- laravel.com/docs/5.3/eloquent-mutators 【参考方案1】:使用 VUE,您可以这样做:
将此行添加到您的表格中
$table->boolean("image-optimization")->default(0);
将此添加到您的模型中,它将修改插入数据库中的值
protected $casts = ['image-optimization' => 'boolean'];
您不必使用此方法修改请求
文档:https://laravel.com/docs/8.x/eloquent-mutators
【讨论】:
【参考方案2】:您是否记得在文章模型的$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>
【讨论】:
不错的解决方案!非常感谢。【参考方案3】:您可以检查复选框是否设置为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');
【讨论】:
【参考方案4】:当一个复选框被勾选时,它的值会出现在发布的数据中。取消勾选时,它的价值不存在。这意味着当您执行$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();
【讨论】:
以上是关于如何在 laravel eloquent 中保存布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Laravel Eloquent 在数据库中保存 JSON 响应,我收到错误“数组到字符串转换”
如何在没有 Laravel 尝试将其保存到数据库的情况下在 Eloquent 模型中使用受保护的属性
如何在 Laravel Eloquent ORM 中获取插入的多行数据
Payum - Laravel 4 的包。如何使用 Eloquent 而不是 FilesystemStorage 创建模型数据?