计算在 Laravel 中有关系的关系
Posted
技术标签:
【中文标题】计算在 Laravel 中有关系的关系【英文标题】:Count relations that have a relation in Laravel 【发布时间】:2018-06-26 11:05:22 【问题描述】:使用 Laravel Eloquent ORM 系统,我创建了以下模型:
/**
* @property int $id
*/
class Category extends Model
public function questions()
return $this->hasMany(Question::class);
/**
* @property int $id
* @property int $category_id
*/
class Question extends Model
public function answers()
return $this->hasMany(Answer::class);
/**
* @property int $id
* @property int $question_id
*/
class Answer extends Model
现在我正在尝试加载以下值:
-
所有类别
每个类别的问题数量
每个类别的已回答问题数量
我已经使用此代码解决了 1 和 2:
$categories = Category
::withCount('questions')
->get();
$vars = ['categories' => $categories];
对于第三个值,我尝试了类似的方法(不起作用):
$categories = Category
::withCount(['questions', 'questions as answered_questions' => function ($query)
$query->select()
->from('answers')
->whereRaw('answers.question_id = questions.id');
])
->get();
如何有效地计算有一个或多个答案的问题数量?
【问题讨论】:
这可能会帮助你***.com/questions/39633691/… @rkj 感谢您的建议,但这并不能解决我的问题。有了那里给出的解决方案,我可以计算答案的数量,而不是有答案的问题数量。 你所说的有答案的问题数量是什么意思?您的意思是至少有一个答案的问题数量? @rkj 没错,这就是我要找的东西 【参考方案1】:你可以试试has
类别模型
class Category extends Model
public function questions()
return $this->hasMany(Question::class);
function answers()
return $this->hasManyThrough(Answer::class, Question::class);
获取数据
$categories = Category::withCount('questions')->has('answers')->get();
foreach($categories as $category)
$category->name." - ". $category->questions_count;
这里questions_count
是该类别至少有一个答案的全部问题
【讨论】:
answers_count
现在不包含答案数量而不是已回答问题吗?
questions_count
是该类别至少回答了一个问题的数量,answers_count
是该类别所有问题的回答总数
如果您只需要一些有答案的问题,请从withCount
中删除answers
啊,我明白了。我对那部分感到困惑,因为我确实不需要大量答案。非常感谢!
很高兴它可以帮助你【参考方案2】:
在@rkj 的帮助下,我发现了has
函数。这样我就可以创建以下解决方案:
$categories = Category
::withCount(['questions', 'questions as answered_questions' => function ($query)
$query->has('answers');
])
->get();
现在我可以使用$category->questions_count
和$category->answered_questions
,这正是我所需要的。
【讨论】:
以上是关于计算在 Laravel 中有关系的关系的主要内容,如果未能解决你的问题,请参考以下文章
快速向有关系的表中插入 200 多个数据 - Laravel 5.6