【问题标题】:Eloquent not removing record from database on AJAX callEloquent 不会在 AJAX 调用中从数据库中删除记录
【发布时间】:2016-10-16 02:13:45
【问题描述】:

我正在尝试为帖子实现一个“喜欢”系统,并且有一个 CSS 动画按钮和三个通过帖子的 AJAX 调用。

  1. 用于检查帖子是否已被点赞,并将特定样式应用于按钮。
  2. 在用户单击按钮时将记录添加到表中。
  3. 如果用户再次单击它会删除记录。

AJAX 代码:

$(document).ready(function() {
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

$.ajax({
    url : '/like/alreadyLiked',
    method : 'POST',
    dataType : 'json',
    data : {
        slug : '{{Request::segment(2)}}',
        user_id : '{{Auth::user()->user_id}}'
    },
    success : function (data) {
        if(data.display === true){
            $('#likelink').attr('class', 'like active')
        }else{
            $('#likelink').attr('class', 'like');
        }
    }
});

if($('#likelink').hasClass('like') && $('#likelink')[0].classList.length == 1){
    $('#likelink').on('click', function(e){
        e.preventDefault();
        $.ajax({
            url : '/like',
            method : 'POST',
            dataType : 'json',
            data : {
                slug : '{{Request::segment(2)}}',
                user_id : '{{Auth::user()->user_id}}'
            },
            success : function(data){
                if(data.display === true){
                    $('#likelink').attr('class', 'like');
                }
            }
        });

    });
}else{
    $('#likelink').on('click', function(e){
        e.preventDefault();
        $.ajax({
            url : '/dislike',
            method : 'POST',
            dataType : 'json',
            data : {
                slug : '{{Request::segment(2)}}',
                user_id : '{{Auth::user()->user_id}}'
            },
            success : function(data){
                if(data.display === true){
                    $('#likelink').attr('class', 'like');
                }
            }
        });

    });

}
});

PHP(Laravel 代码):

    public function hasHeAlreadyLikedThisPost()
{
  if(request()->ajax()){
      $post = Post::where('slug', '=', request()->input('slug'))->first();
      $post_id = $post->post_id;
      $like = Like::where(['user_id' => request()->input('user_id'), 'post_id' => $post_id])->first();
      if($like != null){
        return response()->json(['display' => true]);
      }else{
        return response()->json(['display' => false]);
      }
  }
}

public function addLike()
{
  if(request()->ajax()){
    $slug = request()->input('slug');
    $user_id = request()->input('user_id');

    $post = Post::where('slug', '=', $slug)->first();

    $like = Like::create(array(
      'user_id' => $user_id,
      'post_id' => $post->post_id
    ));

    if($like->exists){
      return response()->json(['display' => true]);
    }else{
      return response()->json(['display' => false]);
    }
  }

}

public function dislike()
{
  $slug = request()->input('slug');
  $user_id = request()->input('user_id');
  $post = Post::where('slug', '=', $slug)->first();
  $like = Like::where(['post_id' => $post->post_id, 'user_id' => $user_id])->delete();
  return response()->json(['display' => false]);
}

问题是“检查”和“插入”调用有效,但“删除”调用无效。在任何情况下,它都会向数据库添加一条新记录,并且不会更改样式。

【问题讨论】:

  • 您是否测试过它实际到达该函数的位置,以及是否是在您的查询中提取了哪些记录以进行删除?

标签: ajax laravel eloquent


【解决方案1】:

试一试

$(document).on('click', '#likelink', function(e)

而不是$('#likelink').on('click', function(e)

【讨论】:

    【解决方案2】:

    我认为你忘了先打电话(或得到)

    $like = Like::where(['post_id' => $post->post_id, 'user_id' => $user_id])->first()->delete();
    

    where() 返回一个查询,但 delete 似乎适用于雄辩的模型对象。因此,要从查询中获取模型对象,您将调用 first() (就像您之前所做的那样),或 get() 来获取一个数组并在每个数组上应用 delete() 对其进行迭代

    【讨论】:

    • 结果是一样的。它不会删除记录,无论如何都会重新添加。
    猜你喜欢
    • 2013-05-05
    • 2014-11-23
    • 2018-03-16
    • 2020-03-06
    • 1970-01-01
    • 2010-11-18
    • 2013-10-13
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多