Php 拉威尔动力公司在哪里

Php 拉威尔动力公司在哪里,php,eloquent,Php,Eloquent,我正在尝试通过关系路径运行查询。以人类可读的格式: Get collection of orders where $order->orderItem->product->sku is LIKE 'red-jumper'; 我可以使用whereHas查询手动创建此项,如下所示: $query->whereHas('orderItems', function($query) use($request){ $query->whereHas('product',

我正在尝试通过关系路径运行查询。以人类可读的格式:

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 . '%');
            });
        });
    });
});

也许有更好的方法一起做这件事?

我认为有一个稍微好一点的方法。你可以用圆点。用于将$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


我刚刚意识到整个收集->减少部分有点过分了。你可以将数组内爆,得到同样的结果。内爆$path,“.”我实际上是从一个点路径开始,进入数组路径,所以我可以一起跳过这一步
$query->whereHas($dotPath, function ($query) use ($request, $param){
    $query->where($param, 'LIKE', '%' . $request->search . '%');
})->get();