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

Laravel 6: can set boolean to 1 but not to zero

所以基本上我的任务有一个最喜欢的值。它被命名为 'favorited' 并且有一个布尔值 1/true 或 0/false。 (mySQL)

目前,每一行(一个任务)都有一个字体很棒的星,如果收藏是1,它会变成fas,文字为金色,所以它会显示一个金色的星星。如果favorited为0,就会变far,变成一个白色的星星,里面是空的。

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

它有 class del_link 触发 javaScript/jQuery 功能。提交 <a> parent 表单

$('.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.php

代码
public function update(Request $request, Task $task)
{
    $task->update([
       'favorited' => request()->has('favorited')
    ]);

    return back();
}

其实上面的代码和方法是我从Laravel 5.8 scratch视频中得到的。 (Laracasts laravel 教程)

我使用复选框而不是星标对我有用,但这种方式行不通。

我试过使用冗长的 if 语句,如果请求为 1,我会将其设置为 1。(请求 = 1 表示隐藏输入为 1,因此未被收藏)和其他,所以如果为 0,它会将其设置为 0,从而取消收藏。

但那样的话,还是不行。我已经添加了请求、任务和文本以显示我在哪里以及我得到了什么,但无济于事。

感谢您的帮助

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

相反,使用 (bool)$request->input('favorited') 应该可以。或者,如果您没有将 favorited 属性转换为布尔值 (bool)$request->input('favorited') ? 1 : 0.

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

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

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

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

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

欢迎来到 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。

因此:删除输入类型="hidden",并将 a-href 更改为按钮。

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

这应该可以做到。