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

the*_*age 2 php search scope model laravel

我在 Laravel 中有一个名为的 Model Blah(我这样命名是因为你不能简单地命名一个 class 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: ""
   }
Run Code Online (Sandbox Code Playgroud)

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

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

上面的范围搜索将允许我搜索该术语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 . '%'
        )
        ;
}
Run Code Online (Sandbox Code Playgroud)

谢谢伊恩。

Ian*_*son 5

您可以使用查询生成器的orWhere() 方法来执行与示例类似的操作:

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

然而,这里真正的问题是,MySQL“类似”查询可能不够强大,无法完成您想要做的事情,因为 或subject_code列都不course_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 . "%");
    }
Run Code Online (Sandbox Code Playgroud)

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

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