php - 使用 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)
);
我已经为每个数据库表创建了模型类,因此您可以通过Question
、Category
和来引用它们QuestionsCategory
。
解决方案
在模型中定义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);
推荐阅读
- powershell-2.0 - powershell 2.X 是否支持下载和运行脚本?
- java - 我在将 java 转换为 kotlin 时遇到问题
- sql - 使用子查询从右表中获取最新记录
- c++ - 传递可变参数
- c++ - 将共享库与 CMake 链接时“没有这样的文件或目录”
- python-3.x - 如何使用 Python 接口隐藏类方法内容?
- java - 在项目 ':dolphin-music:dolphin-music-service' 中找不到任务 'nativeImage'
- python - ValueError: X 每个样本有 94698 个特征;期待 94686
- python - ElementNotInteractableException:消息:键盘无法访问元素
- android - 避免 AsyncTask 中的泄漏