根据 Laravel 的众多选项过滤匹配的集合

问题描述 投票:0回答:1
$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
。但是,品牌将为空,因为它不匹配。

当我必须过滤每个关系时,过滤掉集合中不匹配的选项的最佳方法是什么?

laravel eloquent filtering
1个回答
0
投票

为了解决这个问题,您可以构建一个灵活的查询,该查询将根据 $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();
© www.soinside.com 2019 - 2024. All rights reserved.