查询建筑物 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)
);
我已经为每个数据库表创建了模型 类,因此您可以通过 Question
、Category
和 QuestionsCategory
来引用它们。
在您的 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);
我正在尝试编写一个搜索功能,它不仅可以让我按问题的类别进行搜索,还可以按问题的内容进行搜索。我正在使用 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)
);
我已经为每个数据库表创建了模型 类,因此您可以通过 Question
、Category
和 QuestionsCategory
来引用它们。
在您的 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);