Граф отношений, которые имеют отношение в Laravel - PullRequest
0 голосов
/ 26 июня 2018

Используя систему ORM Laravel Eloquent, я создал следующие модели:

/**
 * @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();

Как эффективно рассчитать количество вопросов, имеющих один или несколько ответов?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

С помощью @rkj я узнал о функции has. С этим я смог создать следующее решение:

$categories = Category
    ::withCount(['questions', 'questions as answered_questions' => function ($query) {
        $query->has('answers');
    }])
    ->get();

Теперь мне доступны $category->questions_count и $category->answered_questions, и это именно то, что мне нужно.

0 голосов
/ 26 июня 2018

можно попробовать 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 - это общий вопрос, на который есть хотя бы один ответ для этой категории

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...