簡體   English   中英

Laravel 5:在null和其他持久性問題上調用成員函數sum()

[英]Laravel 5: Call to a member function sum() on null and other persistence issues

我有一個線程注釋列表,每個列表都使用jquery.upvote.js帶有upvote / downvote按鈕。

投票操作是通過ajax完成的,並且可以正常工作,使贊成票或反對票以正確的值注冊到數據庫中。 刪除投票將從數據庫中刪除該記錄。 因此,從技術上講,它可以按預期工作。

但是,我有兩個問題:

  1. 用戶重新進行的投票不會在頁面重新加載后保持不變,這很重要,否則用戶將不知道自己對投票進行了投票。
  2. 當我將這段代碼{{ $each_comment->commentvotes->sum('value') }}到視圖中以獲取給定評論的票數之和時,出現以下錯誤:

在null上調用成員函數sum()

路線

Route::resource('votes', 'VotesController');
Route::resource('commentvotes', 'CommentVotesController');

我想指出的是,我已經在Vote模型和VoteController的帖子投票中成功使用了相同的方法。

CommentVote模型

class CommentVote extends Model
{
    protected $table = 'commentvotes';

    protected $fillable = [
        'value',
        'comment_id',
        'user_id'
    ];

    public function user() {
        return $this->belongsTo('App\User');
    }

    public function posts() {
        return $this->belongsTo('App\Comment');
    }
}

CommentVotesController

class CommentVotesController extends Controller
{
    public function __construct() {
        $this->middleware('auth', ['only' => ['create', 'edit'] ]);
    }

    public function store(Requests\CommentVoteRequest $request)
    {
        $commentId = $request->input('commentId');
        $userId = $request->user()->id;
        $value = $request->input('value');

        // Check to see if there is an existing vote
        $vote = CommentVote::whereCommentId($commentId)->whereUserId($userId)->first();
        if (!$vote)
        {
            // First time the user is voting
            CommentVote::create(['comment_id' => $commentId, 'user_id' => $userId, 'value' => $value]);
        } else {
            $vote->value == $value ? $vote->delete() : $vote->update(['value' => $value]);
        }
        // AJAX JSON RESPONSE
        return response()->json(['status' => 'success',
            'msg' => 'Vote has been added.']);
    }
}

Java腳本

$(document).ready(function() {
        $('.topic').upvote();
        $('.comment').upvote();

        $('.vote').on('click', function (e) {
            e.preventDefault();
            var $button = $(this);
            var postId = $button.data('post-id');
            var value = $button.data('value');
            $.post('http://localhost/r2/public/votes', {postId:postId, value:value}, function(data) {
                if (data.status == 'success')
                {
                    // Do something if you want..
                }
            }, 'json');
        });

        $('.commentvote').on('click', function (e) {
            e.preventDefault();
            var $button = $(this);
            var commentId = $button.data('comment-id');
            var value = $button.data('value');
            $.post('http://localhost/r2/public/commentvotes', {commentId:commentId, value:value}, function(data) {
                if (data.status == 'success')
                {
                    // Do something if you want..
                }
            }, 'json');
        });
    });

視圖的相關部分comment_list.blade.php

@foreach($comments as $each_comment)
<div class="col-md-1">
    <div class="upvote comment" data-comment="{{ $each_comment->id }}">
        <a class="upvote commentvote {{ $each_comment->commentvotes && $each_comment->commentvotes->contains('user_id', Auth::id()) ? ($each_comment->commentvotes->where('user_id', Auth::id())->first()->value > 0 ? 'upvote-on' : null) : null}}" data-value="1" data-comment-id="{{ $each_comment->id }}"></a>
        <!-- Notice how we set the sum of the votes for this post here -->
        <span class="count">{{ $each_comment->votes->sum('value') }}</span>
        <a class="downvote commentvote {{ $each_comment->commentvotes && $each_comment->commentvotes->contains('user_id', Auth::id()) ? ($each_comment->commentvotes->where('user_id', Auth::id())->first()->value < 0 ? 'downvote-on' : null) : null}}" data-value="-1" data-comment-id="{{ $each_comment->id }}"></a>
    </div>
</div>
@endforeach

您必須在Comments模型中定義關系。 否則,Comment實體將無法訪問CommentVotes。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM