我有一个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:我想输入关键字并搜索是否适合客户名称。
答案 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();