Laravel-在一个查询中搜索两个表

时间:2018-10-08 03:09:10

标签: laravel

我有一个ajax搜索框,可在一个表中搜索。我希望它也将搜索范围扩展到另一个表:

public function search(Request $request)
{
    if($request->ajax()) {
        $output="";
        $files = File::where('id','LIKE','%'.$request->search.'%')
        ->get();
        if($files)
        {
            foreach ($files as $key => $file) {
                $output.='<tr>'.
                '<td><a href=/files/'. $file->id. '>View '. $file->id. '</a></td>'.
                '<td>'.$file->customer->name.'</td>'.
                '<td>'.$file->vehicle_id.'</td>'.
                '<td>'.$file->job_status.'</td>'.
                '<td>'.$file->job_status_note.'</td>'.
                '<td>'.$file->file_status.'</td>'.
                '</tr>';
            }
        }
    }
    return Response($output);
}

如果您在for循环中注意到,我将根据ID提取客户名称。

        '<td>'.$file->customer->name.'</td>'.

此特定表存储客户ID。我已经与客户建立了关系(客户有许多文件/文件属于一个客户)。我也在尝试将搜索范围也扩展到客户表。

这就是我尝试的方式-

    $files = File::where('id','LIKE','%'.$request->search.'%')
    ->orWhere('customer->name','LIKE','%'.$request->search.'%')
    ->get();

似乎不起作用。我究竟做错了什么? Jist:我想输入关键字并搜索是否适合客户名称。

2 个答案:

答案 0 :(得分:0)

在文件模型中定义与客户的关系。
我相信客户有很多文件,而文件有一个客户,所以。

您正在寻找的是orWhereHas()函数。

此函数检查是否存在满足给定条件的关系。

class File extends Model
{
    public function customer()
    {
        return $this->belongsToMany(Customer::class);
    }
}

使用关系过滤结果。

$files = File::where('id','LIKE','%'.$request->search.'%')
    ->orWhereHas('customer', function ($query) {
        $query->where('name', 'LIKE','%'.$request->search.'%');
    })
    ->get();

答案 1 :(得分:0)

如前所述,请确保您的File模型中包含以下内容:

class File extends Model
{
  public function customer()
  {
    return $this->belongsTo(Customer::class);
  }
}

在那之后,您可以使用类似的东西来全部获取它们:

$files = File::leftJoin('customers', 'customers.id', '=', 'files.customer_id')
         ->where('id','LIKE', '%'.$request->search.'%')
         ->orWhere(DB::raw('LOWER(`customers`.`name`)'), 'LIKE', '%'. strtolower($request->search).'%')
         ->get();