Как запросить глубокие отношения в laravel и отфильтровать родителей по детям?

Например, если в категории много товаров с множеством артикулов, как мне получить все товары, у которых есть артикул с ценой выше 10?

Это возвращает все категории, но имеет только ожидаемые SKUS, где мне нужны только категории, в которых указаны SKUS.

$category = new Category();
$category->with(array('products', 'products.skus' => function ($query) {
    $query->where('price', '>', 10);
}))->get();

person Aaron Campbell    schedule 23.01.2015    source источник


Ответы (2)


То, что вы ищете, это whereHas(). Также вы можете написать with(array('products.skus')) напрямую без products

$category = new Category();
$categories = $category->with(array('products', 'products.skus' => function ($query) {
        $query->where('price', '>', 10);
    }))
    ->whereHas('products.skus', function($query){
        $query->where('price', '>', 10);
    })->get();

Вам нужны оба, with и whereHas, но вы можете немного упростить код, поместив замыкание в переменную:

$priceGreaterTen = function($query){
    $query->where('price', '>', 10);
};

$category = new Category();
$categories = $category->with(array('products', 'products.skus' => $priceGreaterTen))
                       ->whereHas('products.skus', $priceGreaterTen)
                       ->get();
person lukasgeiter    schedule 23.01.2015
comment
Я продолжаю получать Call to undefined method Illuminate\Database\Query\Builder::products.skus() - person Aaron Campbell; 24.01.2015
comment
У вас последняя версия Laravel? Поддержка вложенных отношений в whereHas была включена совсем недавно. Беги composer udpate - person lukasgeiter; 24.01.2015
comment
Хорошо, я все еще на 4.1. Надеюсь, обновление не сломает все. - person Aaron Campbell; 24.01.2015

Для Laravel 5 попробуйте это

$category = Category::with(['products','products.skus'])->whereHas('products.skus', function($query) {
    $query->where('price', '>', 10);
})->get();
person Sem    schedule 08.08.2019