Запрос здания с помощью Laravel's Eloquent - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь закодировать функцию поиска, которая позволяет выполнять поиск не только по категории вопроса, но и по его содержанию. Я использую PostgreSQL и его ts_vector возможности для контента. Для категорий я хочу использовать Eloquent и Query Builder от Laravel.

Поиск контента полностью работает, но я не могу понять, как ограничить отображаемые вопросы вопросами с этими категориями. Это то, что я до сих пор:

$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.

1 Ответ

0 голосов
/ 19 мая 2018

Определите 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);
...