Laravel динамический, где есть - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь выполнить запрос по пути отношений.В удобочитаемом формате:

Get collection of orders where $order->orderItem->product->sku is LIKE 'red-jumper';

Я могу создать это вручную, используя запрос whereHas следующим образом:

$query->whereHas('orderItems', function($query) use($request){
    $query->whereHas('product', function ($query) use($request){
        $query->where('sku', 'LIKE', '%' . $request->search . '%');
    });
});

Однако, если я хочу, чтобы это было динамическим и не знал суммууровней в отношениях, как я могу это сделать?

Я бы искал что-то вроде:

$paths = [
0 => 'orderItems'
1 => 'product,
2 => 'sku'
];

$query->whereHas($paths[0], function($query) use($request, $paths){
    $query->whereHas($paths[1], function ($query) use($request, $paths){
        $query->whereHas($paths[2], function ($query) use($request, $paths) {
            $query->whereHas($paths[3], function ($query) use ($request, $paths) {
                $query->where('sku', 'LIKE', '%' . $request->search . '%');
            });
        });
    });
});

Может быть, есть лучший способ сделать все это вместе?

1 Ответ

1 голос
/ 09 апреля 2019

Есть немного лучший способ, по моему мнению. Вы можете использовать точечную (.) Нотацию для отношений и коллекций, чтобы превратить ваш массив $ path в то, что вы хотите. Сначала мы уменьшаем $ path до точечных отношений и отделяем атрибут, который вы хотите отфильтровать, позже

$path = ['orderItems', 'product', 'sku']
$param = array_pop($path)
// $path = ['orderItems', 'product']
// $param = 'sku'
$dotPath = collect($path)->reduce(function ($c, $i) {
    return $c . $i . '.';
});
// $dotPath = 'orderItems.product.'

$dotPath = substr($dotPath, 0, -1)
// $dotPath = 'orderItems.product'

А потом мы проверяем с whereHas

$query->whereHas($dotPath, function ($query) use ($request, $param){
    $query->where($param, 'LIKE', '%' . $request->search . '%');
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...