Laravel Eloquent 搜索多个字段和关系

Laravel Eloquent search multiple fields and relationship

我正在尝试创建一个搜索查询,以便我可以在几个不同的字段中搜索相同的字符串。该查询还需要从 machine_warranties 中搜索字段,该 machine_warrantiesMachines 模型上设置为 hasOne 关系。

这是机器模型中的保修关系

public function warranty()
{
    return $this->hasOne('App\MachineWarranty', 'machine_id');
}

这是我对查询的尝试。搜索序列号或机器类型工作正常,但我不知道如何搜索关系。

Machine::orderBy('created_at', 'desc')
  ->where('serial', 'LIKE', '%' . $search . '%')
  ->orWhere('type', 'LIKE', '%' . $search . '%')
  ->with(['warranty' => function($query) use ($search) {
       $query->where('first_name', 'LIKE', '%' . $search . '%');
  }]);

有没有办法->orWith()可能?

使用orWhereHas()方法:

Machine::latest()
    ->where('serial', 'like', '%' . $search . '%')
    ->orWhere('type', 'like', '%' . $search . '%')
    ->orWhereHas('warranty', function($q) use($search) {
        $q->where('first_name', 'like', '%' . $search . '%');
    })
    ->get();

使用whereHas()进行and查询:

Machine::orderBy('created_at', 'desc')
->where('serial', 'LIKE', '%' . $search . '%')
->orWhere('type', 'LIKE', '%' . $search . '%')
->with('warranty')
->whereHas('warranty' , function($query) use ($search) {
   $query->where('first_name', 'LIKE', '%' . $search . '%');
})->get();