首页 > 解决方案 > 使用 Laravel 的 Eloquent 构建查询

问题描述

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

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

$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)
);

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

标签: phplaravelpostgresqleloquentlaravel-query-builder

解决方案


在模型中定义categories关系Question

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);

推荐阅读