首页 > 解决方案 > 计算在 Laravel 中有关系的关系

问题描述

使用 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. 每个类别的问题数量
  3. 每个类别的已回答问题数量

我已经使用以下代码解决了 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();

如何有效地计算具有一个或多个答案的问题数量?

标签: phpsqllaraveleloquent

解决方案


你可以试试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是对该类别至少有一个答案的总问题


推荐阅读