我需要根据belongsToMany
关系获取所有记录的计数。 通常我可以在模型内的函数中使用groupBy()
。 但是如果我在模型函数中使用count()
或withCount()
,则会出现如下错误:
函数代码:
public function TaskCount(){
return $this->belongsToMany(User::class)->count();
}
错误信息:
SymfonyComponentDebugExceptionFatalThrowableError: Call to a member function addEagerConstraints() on int in file /Users/dragonar/Dev/iyw/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php on line 560
如果我执行以下操作...
public function TaskCount(){
return $this->belongsToMany(User::class)->Count();
}
//expected record is 4(int)
//output is 4(array) user records.
。它给了我数据,但就像用户的 4 条记录而不是数字 4。用户数据是无用的。唯一需要的是totalCount
这些记录。
关系方法必须返回关系类型对象。您返回的是查询结果,count()
返回一个数字,而不是关系对象/生成器。从您要返回的语句中删除count
。在此处重命名了关系tasks
。
public function tasks()
{
return $this->belongsToMany(User::class);
// this returns a Relation type object a BelongsToMany object
}
在您需要使用该关系的地方,您可以使用count
:
$something->tasks()->count();
或者,您可以使用loadCount
加载关系的计数:
$something->loadCount('tasks');
$something->tasks_count;
或者通过预先加载集合:
$results = Something::withCount('tasks')->get();
foreach ($results as $model) {
echo $model->tasks_count;
}
如果您真的想要,也可以创建一个访问器来获取计数,您可能只想通过预加载关系并使用动态属性在访问器中访问它来避免 N+1 问题。
这些关系对象是生成器。当您之前调用返回生成器的groupBy
时,它不会执行查询。您可以添加 where 条件和排序依据语句,因为它们只是构建查询,而不是执行查询,它们返回您正在调用该方法的构建器。
Laravel 6.x 文档 - 雄辩 - 关系 - 计数 相关模型withCount
loadCount
为什么不使用:Task::all()->count();
?
您可以使用withCount
方法调用这样的关系
User::withCount('images')->get();
您可以添加获取数据并对其进行计数。
public function TaskCount(){
return $this->belongsToMany(User::class)->get()->count();
}
你可以这样称呼它
$taskCount = $task->TaskCount();