我在 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_code
和 course_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_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 . "%");
}
这将执行类似的查询,匹配任何由空格分隔的 subject_code
和 course_no
值包含搜索字符串的行(或者如果 course_title
包含它)。
不过,我认为您的需求可能需要一个实际的搜索引擎。
关于php - Laravel Model 中多列数据的搜索范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31416476/