为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 6:可以将布尔值设置为 1 但不能设置为零

Laravel 6:可以将布尔值设置为 1 但不能设置为零

PHP
qq_遁去的一_1 2022-01-14 17:06:03
所以基本上我对我的任务有一个最喜欢的价值。它被命名为“收藏夹”并且有一个布尔值,所以 1/true 或 0/false。(mysql)目前,每一行(一个任务)都有一个字体真棒星,如果收藏为1,它将变成带有金色文本的fas,因此它会显示一个金色星。如果收藏为0,它会变远,这使它成为一个内部空的白色星星。<a href="#" class="del_link text-white"><i class="{{ $task->favorited ? 'text-gold fas' : 'far' }} fa-star"></i></a>它具有del_link触发 javaScript/jQuery 函数的类。哪个提交<a>父表单$('.del_link').each(function(){    $(this).on('click', function(event){        $(this).parent().submit();    });});现在这是包裹在 <a></a><form method="post" action="{{ route('tasks.update', $task) }}">    @csrf @method('patch')    <input type="hidden" name="favorited" value="{{ $task->favorited ? 0 : 1 }}">    <a href="#" class="del_link text-white"><i class="{{ $task->favorited ? 'text-gold fas' : 'far' }} fa-star"></i></a></form>所以基本上,如果收藏=== 1,则将收藏值设置为0,所以当我提交表单时,我将收藏值设置为0。现在由于某种原因这不起作用。每当我按下星号以便收藏它时,它都会起作用,但是当我反其道而行之时,它就会被取消收藏;它没有。这是我的代码 TaskController.phppublic function update(Request $request, Task $task){    $task->update([       'favorited' => request()->has('favorited')    ]);    return back();}实际上,上面的代码和方法是我从 Laravel 5.8 临时视频中得到的。(Laracasts laravel 教程)它使用复选框而不是使用星号对我有用,但它不能以这种方式工作。我尝试过使用冗长的 if 语句,如果 request 为 1,我会将其设置为 1。(request = 1 表示隐藏输入为 1,因此不被收藏)和 else,所以如果为 0,它会将其设置为 0 从而不喜欢它。但在那种情况下,它仍然没有用。我已经 dd 请求、任务和文本来告诉我我在哪里以及我得到了什么,但无济于事。谢谢你的帮助
查看完整描述

3 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

当您使用时request()->has('favorited'),它会true在请求包含输入favorited=1favorited=0(两种情况)时返回。

它确实适用于复选框,因为当type="checkbox"未选中输入时,它不会在请求中发送。

当它是 inputtype="hidden"时,favorited将一直出现在请求中。

你应该把它改成 'favorited' => (int)(bool)request()->input('favorited')


查看完整回答
反对 回复 2022-01-14
?
慕容708150

TA贡献1831条经验 获得超4个赞

根据Laravel 文档 $request->has('favorited')检查favorited请求中是否存在。无论是设置为 0、1 还是任何其他值都不会影响返回值。

相反,使用(bool)$request->input('favorited')应该工作。或者,如果您没有将favorited属性转换为 boolean (bool)$request->input('favorited') ? 1 : 0

如果这不起作用,则说明请求中的值设置不正确,因此很可能是前端问题。在这种情况下,dd($request->input('favorited'))查看该值是否按预期存在。我没有立即看到您的视图和 js 存在问题。


查看完整回答
反对 回复 2022-01-14
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

欢迎来到 Stack Overflow。

您的问题出在前端和后端:

  1. 后端:request()->has('field'); 请求将始终具有此字段,这意味着它的值始终为1,因为您提供了输入字段。

  2. 前端:您没有更改输入的值。

对此有两个修复: 1. 前端您可以设置 Javascript 以在您按下此键时更改输入值。

  1. 在后端执行与 #1 相同的操作,这样更容易。

所以,这应该适合你:


// First validate you have that field.

request()->validate([

    'favorited' => ['required'],

]);


// Then set the favorited to opposite of current.

$task->update([

   'favorited' => !$task->favorited // notice the "!" (take oposite value)

]);

编辑:顺便说一句,您可以通过删除隐藏输入并提交您想要使用的值来摆脱 Javascript,因为它是 0 或 1。


所以:删除输入类型=“隐藏”,并从a-href更改为按钮。


<button name="favorited">

    <i class="{{ $task->favorited ? 'text-gold fas' : 'far' }} fa-star"></i>

</button>

那应该做的事情。


查看完整回答
反对 回复 2022-01-14
  • 3 回答
  • 0 关注
  • 246 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信