Laravel模型必须返回一个关系实例

时间:2019-07-18 14:22:58

标签: laravel

我的网站有评论。这些评论可以有“投票”,“赞成”和“反对”。

我有一个Comment模型和CommentVote模型。

在我的评论模型中,我有一个返回投票的函数:

public function votes() {
    return $this->hasMany('App\CommentVote', 'comment_id');
}

public function upvotes() {
    return $this->hasMany('App\CommentVote', 'comment_id')->where('vote', 1);
}   

public function downvotes() {
    return $this->hasMany('App\CommentVote', 'comment_id')->where('vote', -1);
}       

请注意,上次投票以1的形式存储在tinyInt数据库中,下次投票以-1的形式存储

在我的CommentVote模型中,我具有belongsTo关系:

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

现在,我想拥有一个计算评论总“分数”的函数。总投票数减去总投票数。

我尝试创建一个计算所有支持票-所有支持票的函数。

public function score() {
    return $this->upvotes()->count() - $this->downvotes()->count();
}   

这将返回错误:

  

App \ Comment :: score必须返回一个关系实例。

实际上,尽管在我的其他模型中都能正常使用,但在任何地方使用count()都会返回此错误。

做一些简单的事情,例如:

public function voteCount() {
    return $this->hasMany('App\CommentVote', 'comment_id')->count();
    or even
    return $this->votes()->count();
}   

将返回错误:

  

App \ Comment :: voteCount必须返回一个关系实例。

为什么会这样?

编辑:

这里是控制器,根据注释中的请求:

public function getSubmission($subchan, $id, $URLtitle) {

    $submission = Submission::where('id', $id)->first();
    $comments = Comment::where('submission_id', $submission->id)->where('parent_id', NULL)->orderBy('created_at', 'desc')->get();

    $comments = $comments->sortByDesc(function($comment){
        return count($comment['upvotes']) - count($comment['downvotes']);
    });     

    if (!$submission) {
        return redirect()->route('home')->with('error', 'Submission not found.' );
    }       

    return view('submissions.submission')
    ->with('submission', $submission)
    ->with('navSubchan', $submission->getSubchan->name)
    ->with('submissionPage', 1)
    ->with('comments', $comments)
    ;

}   

1 个答案:

答案 0 :(得分:1)

我怀疑您正在做$model->score,它将寻找一个名为score()的函数,但是以一种特定的方式期望该函数返回一个HasMany,{{ 1}},HasOne等样式关系对象。

请考虑使用an accessor function

BelongsTo

允许您成功完成public function getScoreAttribute() { return $this->upvotes()->count() - $this->downvotes()->count(); }