进行Ajax调用时,在Laravel应用程序中将布尔值0更改为-1

时间:2016-12-18 20:23:28

标签: jquery ajax laravel

所以,我有一张存放好恶的桌子

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;
    }

1 个答案:

答案 0 :(得分:0)

现在,您的控制器根据请求数据的值将$is_like设置为truefalse

稍后您将设置$like->like = $is_like;,这会导致like对象的$like属性为truefalse

保存并将对象保留到数据库时,like字段将存储为1true)或0({{1} })。

要完成你想要的东西你可以尝试类似的东西 false

这将导致您的$like->like = $is_like ? 1 : -1值作为-1存储在数据库中。

但是,当您在代码中检查该字段时,您必须检查它是否等于false1而不是-1true,因为用PHP false