【问题标题】:Laravel 6: can set boolean to 1 but not to zeroLaravel 6:可以将布尔值设置为 1 但不能设置为零
【发布时间】:2019-09-18 08:17:00
【问题描述】:

所以基本上我对我的任务有一个最喜欢的价值。它被命名为“最喜欢的”并且有一个布尔值,所以 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.php代码

public 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 请求、任务和文本来告诉我我在哪里以及我得到了什么,但无济于事。

感谢您的帮助

【问题讨论】:

    标签: php laravel laravel-6


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这对我有用。此外,应该存在收藏夹,因为这是表单发送的唯一内容。 1 或 0。
    • 这很好地打开了检查元素的大门并像任何数字一样输入,不是吗?
    • @BenjaminBeganović 是的,但由于它像布尔值一样使用,所以没关系。它是=0!=0。并且由于该值被转换为整数,因此没有真正的威胁。你也可以强制转换成10, +(bool)$request-&gt;input('favorited')
    • 如果您知道我的问题(我懒得尝试):如果您将列设置为布尔值并尝试保存例如 2(检查元素),它会崩溃吗??
    • @BenjaminBeganović 如果数据库字段设置为布尔值,您甚至无法保存值10。 MySQL 不是 PHP
    【解决方案2】:

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

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

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

    【讨论】:

    • 是的,谢谢,就是这样,它会检查它是否存在,而不是它是 1 还是 0。
    【解决方案3】:

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

    所以:删除输入 type="hidden",并从 a-href 更改为按钮。

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

    这应该做的事情。

    【讨论】:

    • 对于前端它确实有效,当检查它时,如果它不被收藏,它仍然会显示值 1,反之亦然。转储请求表明我在提交请求时发送了正确的布尔值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2021-02-11
    • 2023-04-03
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多