【发布时间】:2020-05-06 15:25:11
【问题描述】:
我有以下查询,在搜索框中搜索后会产生结果。它工作正常,只是它不会首先带回更具体的结果。例如,如果我搜索“Learn Laravel”,它会首先带来包括“learn”和“laravel”的结果,然后它会带来两者都有的结果。 我试图让查询首先带来确切的结果,然后带来包含这两个词之一的结果。
$searchValues2 = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY);
$posts = DB::table('gl as g')
->join('subcat as a', 'a.id', '=' , 'g.subcat')
->join('steps as s', 's.goal_id','=', 'g.id')
->join('users as u', 'g.user_id', '=' , 'u.id')
->join('country as c', 'c.id', '=' , 'g.country')
->where(function ($q2) use ($searchValues2) {
foreach ($searchValues2 as $value2) {
$q2->orWhere(DB::raw("g.title"), 'LIKE', "%{$value2}%");
$q2->orWhere(DB::raw("s.step"), 'LIKE', "%{$value2}%");
}
})
->where('g.draft_flag', '!=', 1)
->orderby('g.created_at', 'desc')
->take(40)
->groupby('g.id')
->select('g.title as title', 'a.subcat as categ', 'g.id as id', 'u.id as u_id',
'u.first_name as f_name', 'u.last_name as l_name', 'a.subcat as subcat','g.tlike as
tlike','u.avatar as avatar','c.country as country')
->get();
【问题讨论】:
-
您可以尝试构建
orderBys,类似于带有case 语句的where 子句。CASE when g.title = '$value2' THEN 0 else 1 END;等。不过,我建议不要从用户输入中使用未经处理的值构建原始语句。您应该使用绑定而不是将$value2直接放在字符串中以避免SQL 注入。