查询建筑物 Laravel 的 Eloquent

Query building with Laravel's Eloquent

我正在尝试编写一个搜索功能,它不仅可以让我按问题的类别进行搜索,还可以按问题的内容进行搜索。我正在使用 PostgreSQL 及其 ts_vector 内容功能。对于类别,我想使用 Laravel 的 Eloquent 和查询生成器。

内容搜索完全可用,但我不知道如何将显示的问题限制为具有这些类别的问题。这是我目前所拥有的:

$questions = Question::search($query_string)->paginate(NUM_PER_PAGE);

我还有一个字符串数组,它们是类别名称 ($tag_names)。从架构中可以看出,每个名称都是 unique.

这是架构:

CREATE TABLE questions (
    id BIGINT PRIMARY KEY REFERENCES commentables(id) ON DELETE CASCADE,
    title TEXT NOT NULL,
    correct_answer BIGINT UNIQUE,
    search tsvector
);

CREATE TABLE categories (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    description TEXT,
    num_posts INTEGER DEFAULT 0 NOT NULL
);

CREATE TABLE questions_categories (
    question_id BIGINT REFERENCES questions(id) ON DELETE CASCADE,
    category_id INTEGER REFERENCES categories(id) ON DELETE CASCADE,
    PRIMARY KEY (question_id, category_id)
);

我已经为每个数据库表创建了模型 类,因此您可以通过 QuestionCategoryQuestionsCategory 来引用它们。

在您的 Question 模型中定义一个 categories 关系:

public function categories() {
    return $this->belongsToMany(Category::class, 'questions_categories')
}

然后扩展您的查询:

$questions = Question::search($query_string)
    ->whereHas('categories', function($query) use($categoryIds) {
        $query->whereIn('id', $categoryIds);
    })->paginate(NUM_PER_PAGE);