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=1
或 favorited=0
(两种情况)时。
它确实适用于复选框,因为当输入 type="checkbox"
未选中时,它不会在请求中发送。
当它是输入 type="hidden"
时,favorited
将一直出现在请求中。
你应该把它改成'favorited' => (int)(bool)request()->input('favorited')
欢迎来到 Stack Overflow。
你的问题同时存在于前端和后端:
后端:request()->has('field');
请求将始终包含此字段,这意味着它的值一直是 1,因为您已显示输入字段。
前端:您没有更改输入的值。
两个修复:
1.前端你可以设置Javascript当你按下它到相反的时候改变输入值。
- 后台和#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>
这应该可以做到。
所以基本上我的任务有一个最喜欢的值。它被命名为 '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=1
或 favorited=0
(两种情况)时。
它确实适用于复选框,因为当输入 type="checkbox"
未选中时,它不会在请求中发送。
当它是输入 type="hidden"
时,favorited
将一直出现在请求中。
你应该把它改成'favorited' => (int)(bool)request()->input('favorited')
欢迎来到 Stack Overflow。
你的问题同时存在于前端和后端:
后端:request()->has('field'); 请求将始终包含此字段,这意味着它的值一直是 1,因为您已显示输入字段。
前端:您没有更改输入的值。
两个修复: 1.前端你可以设置Javascript当你按下它到相反的时候改变输入值。
- 后台和#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>
这应该可以做到。