php - Laravel Model 中多列数据的搜索范围

标签 php laravel search model scope

我在 Laravel 中有一个名为 Blah 的模型(我这样命名是因为你不能简单地命名一个类 Class,所以我暂时更改了名称)。

classes表中,每一行都包含如下数据:

   {
       year: "2015",
       term: "Summer",
       subject_code: "DIGM",
       course_no: "350",
       instr_type: "Lecture",
       instr_method: "Face To Face",
       section: "003",
       crn: "42953",
       course_title: "Digital Storytelling",
       credits: "3.0",
       day: "R",
       time: "06:30 pm - 09:20 pm",
       instructor: "Teacher Name",
       campus: "University Building",
       max_enroll: "18",
       enroll: "18",
       building: "PLACE",
       room: null,
       description: "By surfing the internet and playing computer games, by lectures, assigned readings, class screening, and research projects, this class explores the impact of digital media on art, design and daily living. This is a writing intensive course. ",
       pre_reqs: "",
       co_reqs: ""
   }

我在我的 Blah 模型中开发了一个范围搜索查询,如下所示:

/**
 * Search scope query
 *
 * @param string
 * @return QueryBuilder
 */
public function scopeSearch($query, $searchTerm) {
    return $query
        ->where('course_title', 'like', "%" . $searchTerm . "%");
}

上述范围搜索允许我搜索术语“digital”,并且它将返回名为“Digital Storytelling”的类。

但是,我想更进一步 - 我希望能够在相同的搜索范围内执行类似 DIGM 350 的搜索(这两个数据点来自 subject_codecourse_no),它会带来相同的结果。

因此,搜索 DIGM 350 和/或 digital 会得到相同的结果。这将是我网站的自动搜索框的一部分。

最终查询:

/**
 * Search for course title or subject name
 * @param $query
 * @param $searchTerm Course Title or Subject Name
 * @return mixed
 */
public function scopeSearch($query, $searchTerm) {
    return $query
        ->where('course_title', 'like', '%' . $searchTerm . '%')
        ->orWhere(DB::raw("subject_code || ' ' ||  course_no"),
            'like',
            '%' . $searchTerm . '%'
        )
        ;
}

谢谢伊恩。

最佳答案

您可以使用orWhere() method查询生成器执行类似于您的示例的操作:

    public function scopeSearch($query, $searchTerm) {
        return $query
            ->where('course_title', 'like', "%" . $searchTerm . "%")
            ->orWhere('subject_code', 'like', "%" . $searchTerm . "%")
            ->orWhere('course_no', 'like', "%" . $searchTerm . "%");
    }

但是,这里真正的问题是 MySQL“类似”查询可能不够强大,无法完成您想要做的事情,因为 subject_codecourse_no 列包含字符串“DIGM 350”。您可以对这些列的串联执行类似的查询,如下所示:

    public function scopeSearch($query, $searchTerm) {
        return $query
            ->where('course_title', 'like', "%" . $searchTerm . "%")
            ->orWhere(DB::raw("CONCAT_WS(' ',subject_code,course_no)"), 'like', "%" . $searchTerm . "%");
    }

这将执行类似的查询,匹配任何由空格分隔的 subject_codecourse_no 值包含搜索字符串的行(或者如果 course_title 包含它)。

不过,我认为您的需求可能需要一个实际的搜索引擎。

关于php - Laravel Model 中多列数据的搜索范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31416476/

相关文章:

php - 通过 PHP 删除记录而不重新加载页面(使用 AJAX)

error-handling - PHP error_log错误到MySQL

php - 如果在 Laravel 中禁用用户时限制登录效果不佳

php - Elasticsearch 查询字符串中的空值

jQuery UI 自动完成 : return "nothing found" when no search matches occur

php - 三角内点解释

javascript - 雅虎财经 API 历史报价

php - Laravel 5.3 Pagination 总页数

php - 播放视频 - 服务器配置不正确 - 12939

search - 在 Web 项目中使用 SOLR 的最佳方法是什么?