我的网站有评论。这些评论可以有“投票”,“赞成”和“反对”。
我有一个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)
;
}
答案 0 :(得分:1)
我怀疑您正在做$model->score
,它将寻找一个名为score()
的函数,但是以一种特定的方式期望该函数返回一个HasMany
,{{ 1}},HasOne
等样式关系对象。
请考虑使用an accessor function。
BelongsTo
允许您成功完成public function getScoreAttribute() {
return $this->upvotes()->count() - $this->downvotes()->count();
}
。