$vehicle = collect([
'brand' => 'Ford',
'model' => 'F-150',
'color' => 'black'
]);
每个系列都会有一辆带有这些选项的独特车辆。但是,如果不包含某些选项,则并非每个选项都会用于搜索。每个结果都会返回一个单一结果。
到目前为止我已经:
$vehicleIndex = \App\Models\VehicleIndex::with([
'brand' => fn ($query) => $query->where('brad', $vehicle->get('brad')),
'model' => fn ($query) => $query->where('model', $vehicle->get('model')),
'color' => fn ($query) => $query->where('color', $vehicle->get('color')),
])->get();
这个想法是,vehicleIndex 返回一个被配置为搜索车辆的唯一过滤器。因此第一个集合可以正确匹配索引中的每个选项。然而,情况可能并非每次都是如此。
因此,一个索引选项可能是:
a black Ford F-150
这将毫无问题地返回结果。
但是如果还有一个索引选项:
F-150
那么上面的查询将返回两个结果。但我不确定将其过滤为只有一个结果的最佳方法
举这个例子:
$vehicle = collect([
'brand' => 'Toyota',
'model' => 'F-150',
'color' => 'green'
]);
索引选项应该只返回
F-150
。但是,查询将选取它们两者,因为两者都返回了 F-150
。但是,品牌将为空,因为它不匹配。
当我必须过滤每个关系时,过滤掉集合中不匹配的选项的最佳方法是什么?
为了解决这个问题,您可以构建一个灵活的查询,该查询将根据 $vehicle 集合中的可用字段进行过滤,同时忽略 null 或未定义的值。这个想法是仅针对 $vehicle 集合中存在的选项向查询添加条件。
以下是如何实现它的示例:
$vehicle = collect([
'brand' => 'Toyota',
'model' => 'F-150',
'color' => 'green',
]);
$vehicleIndexQuery = \App\Models\VehicleIndex::query();
// Check if 'brand' is present and not null
if ($vehicle->has('brand') && $vehicle->get('brand')) {
$vehicleIndexQuery->whereHas('brand', function ($query) use ($vehicle) {
$query->where('brand', $vehicle->get('brand'));
});
}
// Check if 'model' is present and not null
if ($vehicle->has('model') && $vehicle->get('model')) {
$vehicleIndexQuery->whereHas('model', function ($query) use ($vehicle) {
$query->where('model', $vehicle->get('model'));
});
}
// Check if 'color' is present and not null
if ($vehicle->has('color') && $vehicle->get('color')) {
$vehicleIndexQuery->whereHas('color', function ($query) use ($vehicle) {
$query->where('color', $vehicle->get('color'));
});
}
// Execute the query and retrieve the results
$vehicleIndex = $vehicleIndexQuery->get();