postgresql 如何在laravel中合并两个查询?

kzmpq1sx  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我试过分离这两个查询,当它们分离时,它们都能工作,但当我试着合并它们时,却不能工作

public function getTestsByCourseId($courseId, $lang)
{
   
    $nonImportantCount = DB::table('tests')->where(['course_id' => $courseId, 'published' => true])->value('random_questions');

    $tests = $this->test->withTrashed()
        ->where(['course_id' => $courseId, 'published' => true])
        ->with(['questions' => function ($q) use ($lang, $nonImportantCount) {
            $q->where(function ($q) use ($lang, $nonImportantCount) {
                $q->where('important_question', true)
                    ->where('published', true)
                    ->with('translations', function ($q) use ($lang) {
                        $q->whereHas('language', function ($q) use ($lang) {
                            $q->where('short_code', $lang);
                        });
                    })
                    ->with(['questionOptions' => function ($q) use ($lang) {
                        $q->with('translations', function ($q) use ($lang) {
                            $q->whereHas('language', function ($q) use ($lang) {
                                $q->where('short_code', $lang);
                            });
                        });
                    }]);
                if ($nonImportantCount > 0) {
                    $q->orWhere(function ($q) use ($lang, $nonImportantCount) {
                        $q->where('important_question', false)
                            ->where('published', true)
                            ->with('translations', function ($q) use ($lang) {
                                $q->whereHas('language', function ($q) use ($lang) {
                                    $q->where('short_code', $lang);
                                });
                            })
                            ->with(['questionOptions' => function ($q) use ($lang) {
                                $q->with('translations', function ($q) use ($lang) {
                                    $q->whereHas('language', function ($q) use ($lang) {
                                        $q->where('short_code', $lang);
                                    });
                                });
                            }])
                            ->inRandomOrder()
                            ->take($nonImportantCount);
                    });
                }
            });
        }]);

    return $this->appendTranslations($tests, $lang)->get();
}

字符串
我得到的错误:
调用未定义的方法Illuminate\Database\Eloquent\Builder::merge()”
我有测试的问题,可以是重要的或不重要的。每个重要的问题都需要进行测试,但不重要的问题是随机选择的,并且该问题的数量有限(nonImportantCount)

wfveoks0

wfveoks01#

因为在Laravel的查询构建器中没有merge()函数。您可以使用一个查询,在where()子句中使用条件。
您可以使用以下更新的查询获取所有“重要”问题和随机的一组“非重要”问题:

public function getTestsByCourseId($courseId, $lang)
{
    $nonImportantCount = DB::table('tests')
        ->where(['course_id' => $courseId, 'published' => true])
        ->value('random_questions');

    $tests = $this->test->withTrashed()
        ->where(['course_id' => $courseId, 'published' => true])
        ->with(['questions' => function ($q) use ($lang, $nonImportantCount) {
            $q->where('published', true)
                ->with(['translations' => function ($q) use ($lang) {
                    $q->whereHas('language', function ($q) use ($lang) {
                        $q->where('short_code', $lang);
                    });
                }])
                ->with(['questionOptions' => function ($q) use ($lang) {
                    $q->with('translations', function ($q) use ($lang) {
                        $q->whereHas('language', function ($q) use ($lang) {
                            $q->where('short_code', $lang);
                        });
                    });
                }])
                ->where(function ($q) {
                    $q->where('important_question', true);
                })
                ->orWhere(function ($q) use ($nonImportantCount, $lang) {
                    $q->where('important_question', false)
                        ->inRandomOrder()
                        ->take($nonImportantCount);
                });
        }]);

    return $this->appendTranslations($tests, $lang)->get();
}

字符串

相关问题