计算在 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

如何使用 laravel 模型呈现两个有关系的表,例如“sales”表和“sales_content”的情况

与同一张表的关系(多对多?) - Laravel

带有嵌套关系的 Laravel 急切加载

并查集

Laravel - whereHas() 中关系的最新记录