Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当mulplie或Where子句中的Where或orWhere子句为true时,如何执行语句_Php_Laravel_Eloquent - Fatal编程技术网

Php 当mulplie或Where子句中的Where或orWhere子句为true时,如何执行语句

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 .

我试图根据用户搜索的内容,从数据库中的工作列表中搜索相关工作,如果搜索词与工作标题匹配,则搜索结果高度相关,因此我试图在工作对象的where条件得到满足后,立即将相关值分配给工作对象。还有更干净的书写方式或条件在哪里

    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();