所以,我有一张存放好恶的桌子
Likes
--id
--post_id
--user_id
--like
列 like 存储值1或0以表示喜欢或不喜欢。
我想在你不喜欢的时候将0改为-1。
当我构建下面的代码时,我遵循了一个教程,我尝试通过创建一个检查控制器中$request['isLike']
的值的if语句来更改某些变量以用-1替换0。我能够使应用程序存储不喜欢-1,但这搞砸了ajax功能。
无法弄清楚如何使整个事情正常运作。
我只想保留相同的功能,但是将不喜欢的值更改为-1而不是0。
查看:
<a href="#" class="like">{{ Auth::user()->likes()->where('post_id', $post->id)->first() ? Auth::user()->likes()->where('post_id', $post->id)->first()->like == 1 ? 'You like this post' : 'Like' : 'Like' }}</a> |
<a href="#" class="like">{{ Auth::user()->likes()->where('post_id', $post->id)->first() ? Auth::user()->likes()->where('post_id', $post->id)->first()->like == 0 ? 'You don\'t like this post' : 'Dislike' : 'Dislike' }}</a>
<script>
var token = '{{ csrf_token() }}';
var urlLike = '{{ route('like') }}';
</script>
app.js:
var postId = 0;
$('.like').on('click', function(event){
event.preventDefault();
postId = event.target.parentNode.parentNode.dataset['postid'];
var isLike = event.target.previousElementSibling == null; //Checks if it's a like or dislike.
$.ajax({
method: 'POST',
url: urlLike,
data: {isLike: isLike, postId: postId, _token: token}
})
.done(function(){
//Change the page when .ajax has been executed.
event.target.innerText = isLike ? event.target.innerText == 'Like' ? 'You like this post' : 'Like' : event.target.innerText == 'Dislike' ? 'You don\'t like this post' : 'Dislike';
//Make sure you can't dislike and like at the same time.
if(isLike){
event.target.nextElementSibling.innerText = 'Dislike';
} else {
event.target.previousElementSibling.innerText = 'Like';
}
});
});
控制器:
public function postLikePost(Request $request)
{
$post_id = $request['postId'];
$is_like = $request['isLike'] === 'true'; //Get's passed as string in request, changed to boolean.
$update = false;
$post = Post::find($post_id);
if(!$post){
return null;
}
$user = Auth::user();
$like = $user->likes()->where('post_id', $post_id)->first(); //First has to be specified
if($like){
$already_like = $like->like;
$update = true;
//Deletes if it already exists.
if($already_like == $is_like){
$like->delete();
return null;
}
} else {
$like = new Like(); //Creates new row for Like in table
}
$like->like = $is_like; //Set's whatever $like->like to whatever $request['isLike'] passed.
$like->user_id = $user->id;
$like->post_id = $post_id;
if($update){
$like->update();
}else{
$like->save();
}
return null;
}
答案 0 :(得分:0)
现在,您的控制器根据请求数据的值将$is_like
设置为true
或false
。
稍后您将设置$like->like = $is_like;
,这会导致like
对象的$like
属性为true
或false
。
保存并将对象保留到数据库时,like
字段将存储为1
(true
)或0
({{1} })。
要完成你想要的东西你可以尝试类似的东西
false
这将导致您的$like->like = $is_like ? 1 : -1
值作为-1存储在数据库中。
但是,当您在代码中检查该字段时,您必须检查它是否等于false
或1
而不是-1
或true
,因为用PHP false