【发布时间】:2019-12-19 09:45:39
【问题描述】:
一直在尝试不同的方法来使用 Eloquent 对多个嵌套的多对多和 hasmany 关系执行搜索查询,但无法找到解决方案。
为了简化下面我想使用'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);
}
}
目标是根据公司的主要模型搜索不同的模型。在伪代码中将类似于以下内容:
- 在 Company 中查找 name 如
$request->name - 或者像
$request->name这样的公司 网站 - 或者在哪里 Office office_name
$request->name - 或地址 街道
$request->name - 或地址 country.name
$request->name - 或者在哪里 Service addresses.service.name
$request->name
一个公司有很多办公室 办公室有很多地址 Address 包含 Country 和 一个地址有许多服务。
在所有这些中,为了简化(我可能能够推断和处理每个模型的其他字段,我将使用 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.
【问题讨论】:
-
我自己喜欢这种方法,它包括嵌套关系。 freek.dev/… 让它非常干净 imo
-
这个搜索功能是否被用于 jquery 数据表?如果是这样,您可以在视图中定义可搜索的属性,并让数据表处理其余部分。如果没有,也许您可以通过使用诸如
filter()之类的收集方法进行查询之后进行过滤 -
@IGP 没有数据表。那会更容易。即使是 rway 查询对我来说也会更容易,但在 Eloquent 中,我对嵌套关系上的这种类型的查询感到有点困惑。公司 > 办公室 > 地址 > 国家 + 服务。在原始的 Mysql 中,我知道如何立即执行此操作。也会看看 dparoli 和 Robbin Bernard 的建议。
-
如果您在问题中进行编辑,我也许可以将原始 sql 查询转换为 eloquent/builder 格式。
标签: laravel search eloquent relationship