gpt4 book ai didi

相关模型的Laravel计数列

转载 作者:行者123 更新时间:2023-12-01 01:57:59 25 4
gpt4 key购买 nike

我想计算来自 ScripRating 的赞成票和反对票的数量某某Script .

脚本.php:

public function ratings()
{
return $this->hasMany('ScriptRating');
}

ScriptRating.php:
public function script()
{
return $this->belongsTo('Script');
}

script_rating 数据库表:
id (primary, increments)
script_id(integer)
rating(integer) <-- Can be either 1 (upvote) or -1 (downvote)

要检索脚本并显示评级:
$script = Script::where('title', '=', $title)->get();
{{ $script->ratings }}

这工作正常,它返回一个数组: [{"id":1,"script_id":1,"rating":1}] .但在这一点上我被卡住了。我如何计算某个脚本的总赞成票和反对票?

我还有一个小问题让我感到困惑。这与上面的代码相同:
$script = Script::where('title', '=', $title)->with('ratings')->get();
{{ $script->ratings }}

这两种方法有什么区别,我应该使用哪一种?

提前致谢!

编辑

我做了三个范围:
public function scopeTotalRating($query, $scriptId) {
return $query->where('script_id', $scriptId)->get()->sum('rating');
}

public function scopeThumbsUp($query, $scriptId) {
return $query->where('script_id', $scriptId)->having('rating', '=', 1)->get()->sum('rating');
}

public function scopeThumbsDown($query, $scriptId) {
return $query->where('script_id', $scriptId)->having('rating', '=', -1)->get()->sum('rating');
}

并将它们显示如下:
{{ ScriptRating::thumbsUp($script->id) }}

最佳答案

您可以使用
{{ $script->ratings->count() }}
这将显示脚本的总评分数。

但是,您感兴趣的是将评级分组为 upvotesdownvotes ,因此您需要通过 group by 查询您的关系条款。

Script::where('title', '=', $title)->with([
'ratings' => function($query) {
$query->groupBy('rating');
})
])->get();

我相信返回的集合现在应该按 1 分组和 -1 .让我知道结果!

编辑:您还可以在此处查看有关查询关系的文档:

http://laravel.com/docs/4.2/eloquent#querying-relations

编辑响应:

不使用 group by 的最简单方法是单独查询:
$script = Script::where('title', $title)->first();

if ($script) {
$upvotes = ScriptRating::where('script_id', $script->id)->having('rating', '>', 0)->get()->count();

$downvotes = ScriptRating::where('script_id', $script->id)->having('rating', '<', 0)->get()->count();
}

此外,您提到的脚本之间的差异称为 eager loadinglazy loading .当您指定 ->with() 时在您的查询中,这称为预先加载。如果你不这样做,当你指定 $script->ratings 时,查询将被运行。

更多关于急切/延迟加载的信息:

http://laravel.com/docs/4.2/eloquent#eager-loading

编辑另一个回复:

您将使用 ->whereHas('ratings')如果你想收集 的脚本只有有评分。您还可以通过执行 if 语句来检查具有评级的脚本是否存在:
if ($script->ratings->count() > 0) { 
// The script has ratings
} else {
// The script does not have ratings
}

如果您不想继续重复此代码,您可以随时在 Script.php 中放入一个函数。使用以下模型进行建模:
public function hasRatings()
{
return $this->ratings->count() > 0;
}

然后你可以这样做:
if ($script->hasRatings())

关于相关模型的Laravel计数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com