拉拉维尔雄辩的复杂搜索查询问题



一直在尝试不同的方法来使用 Eloquent 对多个和嵌套的多对多和具有多个关系执行搜索查询,但找不到解决方案。

为了简化我想使用'model', 'LIKE', '%' . $request->name . '%'执行搜索的模型部分。

模型

class Company extends Model {
// the class properties, dates, etc...
public function offices(){
return $this belongsToMany(Office::class);
}
}
class Office extends Model {
// the class properties, dates, etc...
public function companies(){
return $this belongsToMany(Company::class);
}
public function addresses(){
return $this belongsToMany(Address::class);
}
}
class Address extends Model {
// the class properties, dates, etc...
public function offices(){
return $this belongsToMany(Office::class);
}
public function services(){
return $this belongsToMany(Service::class);
}
public function countries(){
return $this belongsToMany(Country::class);
}
}
class Service extends Model {
// the class properties, dates, etc...
public function addresses(){
return $this belongsToMany(Address::class);
}
}
class Country extends Model {
// the class properties, dates, etc...
public function addresses(){
return $this belongsToMany(Address::class);
}
}

目标是根据公司的主要模型搜索不同的模型。在伪代码中,如下所示:

  • 公司中查找名称$request->name
  • 或者公司网站喜欢$request->name
  • 或者办公室office_name$request->name
  • 或者地址街道$request->name
  • 或者地址country.name$request->name
  • 或者服务addresses.service.name$request->name

一个公司有很多办事处一个办公室有很多地址一个地址有一个国家一个地址有许多服务

在所有这些中,为了简化(我可能能够推断和处理每个模型的其他字段,我将使用name列。例如。公司名称、办事处名称、地址名称、服务名称国家名称

我现在拥有的是以下内容,它没有按照我的需要执行搜索:

public function search(Request $request)
{
$data = Company::Active()->with('offices', 'addresses', 'offices.addresses')
->where('company_name', 'LIKE', '%' . $request->name . '%')
->orWhere('company_short_description', 'LIKE', '%' . $request->name . '%')
->orWhere('company_long_description', 'LIKE', '%' . $request->name . '%')
->orWhere('company_website', 'LIKE', '%' . $request->name . '%')
->whereHas('offices', function ($query) use ($request) {
$query->where('name', 'LIKE', '%' . $request->name . '%');
})
->whereHas('offices.addresses', function ($query) use($request){
$query->where('name', 'LIKE', '%' . $request->name . '%')
->orWhere('address_city', 'LIKE', '%' . $request->name . '%');
})
->orderBy('company_name')
->paginate(20);
return response()->json($data, 200);
}
Thank you in advance for any help or tips on the better solution to perform this broad (complex) search query with Eloquent.

我想我可以管理查询。不确定是最好的方法还是可能需要一些优化,但我可以从下面的查询中至少得到最近似的结果集。欢迎提出改进建议:)

public function search(Request $request)
{
$data = Company::Active()->with('offices', 'addresses', 'offices.addresses')
->where('company_name', 'LIKE', '%' . $request->name . '%')
->orWhere('company_short_description', 'LIKE', '%' . $request->name . '%')
->orWhere('company_long_description', 'LIKE', '%' . $request->name . '%')
->orWhere('company_website', 'LIKE', '%' . $request->name . '%')
->orWhereHas('offices', function ($query) use ($request) {
$query->where('name', 'LIKE', '%' . $request->name . '%');
})
->orWhereHas('offices.addresses', function ($query) use($request){
$query->where('name', 'LIKE', '%' . $request->name . '%')
->orWhere('address_city', 'LIKE', '%' . $request->name . '%');
})
->orWhereHas('offices.addresses.services', function ($query) use($request){
$query->where('name', 'LIKE', '%' . $request->name . '%');
})
->orderBy('company_name')
->paginate(20);
return response()->json($data, 200);
}

最新更新