Php 当mulplie或Where子句中的Where或orWhere子句为true时,如何执行语句
我试图根据用户搜索的内容,从数据库中的工作列表中搜索相关工作,如果搜索词与工作标题匹配,则搜索结果高度相关,因此我试图在工作对象的where条件得到满足后,立即将相关值分配给工作对象。还有更干净的书写方式或条件在哪里Php 当mulplie或Where子句中的Where或orWhere子句为true时,如何执行语句,php,laravel,eloquent,Php,Laravel,Eloquent,我试图根据用户搜索的内容,从数据库中的工作列表中搜索相关工作,如果搜索词与工作标题匹配,则搜索结果高度相关,因此我试图在工作对象的where条件得到满足后,立即将相关值分配给工作对象。还有更干净的书写方式或条件在哪里 public function search() { $searchText = $_GET['searchText']; $jobs = Jobs::where('name', 'LIKE', '%' . $searchText .
public function search()
{
$searchText = $_GET['searchText'];
$jobs = Jobs::where('name', 'LIKE', '%' . $searchText . '%') //how to do $jobs->relevancy = 100 here? if this where condition is satisfied?
->orwhere('skills', 'LIKE', '%' . $searchText . '%')
->orwhere('desc', 'LIKE', '%' . $searchText . '%') //$jobs->relevancy = 10 here
->orwhere('desc1', 'LIKE', '%' . $searchText . '%')
->orwhere('desc2', 'LIKE', '%' . $searchText . '%')
->orwhere('desc3', 'LIKE', '%' . $searchText . '%')
->orwhere('desc4', 'LIKE', '%' . $searchText . '%')
->get();
return view('results', compact('jobs'));
}
如果要对orWhere条件进行分组,然后应用另一个WHERE(AND)语句,则可以使用闭包进行分组 想象一下你想要这样的东西:
WHERE A
AND (WHERE B OR WHERE C)
AND (WHERE D OR WHERE E)
然后你可以做:
$results = Model::where('A', 'something')
->where(function ($query) {
$query->where('B', 'something')
->orWhere('C', 'something');
})
->where(function ($query) {
$query->where('D', 'something')
->orWhere('E', 'something');
})
->get();
如果您在许多地方使用这种条件,那么您可以执行以下操作 1-在AppServiceProvider内部引导方法中
use Illuminate\Database\Query\Builder;
public function boot()
{
Builder::macro('search', function($field, $string){
return $string ? $this->where($field, 'like', '%'.$string.'%') : $this;
});
Builder::macro('orSearch', function($field, $string){
return $string ? $this->orWhere($field, 'like', '%'.$string.'%') : $this;
});
}
2-您的查询是否符合以下要求
$jobs = Jobs::where(function($query) {
if($searchText != "") {
$query->search('skills', $searchText);
$query->orSearch('desc', $searchText);
$query->orSearch('desc1', $searchText);
$query->orSearch('desc2',$searchText);
$query->orSearch('desc3',$searchText);
}
})->get();
我认为这是一种更简洁的查询方式。要知道where子句中的哪一部分与查询匹配并不容易。在得到结果后,您需要重新进行文本比较,这可能并不理想
在这种情况下,您可能需要考虑全文搜索。
如果您使用的是MySQL,则可以创建全文索引,然后使用。(其他DBMS有不同的语法,但通常有支持) 匹配。。。“反对”将返回相关性得分,例如,100*匹配(名称)
您将向该匹配添加权重100。整体结果应根据搜索的总体相关性排序
有关MySQL全文搜索的更多信息我知道了,谢谢。。但这也不能回答我的主要问题。请检查我的代码,我已经添加了一条评论,以进一步澄清我想要什么。是的,分配权重正是我想要的。非常感谢。
$searchText = request()->searchText;
$jobs = Jobs::whereRaw('MATCH(name) AGAINST (? IN NATUAL LANGUAGE MODE)', [$searchText])
->orWhereRaw('MATCH(desc) AGAINST (? IN NATUAL LANGUAGE MODE)', [$searchText])
// ...
selectRaw('(100*MATCH(name) AGAINST (? IN NATUAL LANGUAGE MODE) + 10*MATCH(name) AGAINST (? IN NATUAL LANGUAGE MODE)) as score', [$searchText,searchText])
->addSelect("*")
->orderBy('score', 'desc')
->get();