Я пытаюсь получить все атрибуты с количеством продуктов, которые связаны с продуктами в данной категории.
структура таблицы
таблица атрибутов:
| id | name | value | filterable |
таблица продуктов:
| id | name |
таблица категорий:
| id | name |
Сводная таблица attribute_product:
| id | attribute_id | product_id
Сводная таблица category_product:
| id | category_id | product_id
Ниже показано, как выглядят мои модели.
Атрибут
public function products(){
return $this->belongsToMany('App\Models\Product');
}
Продукт
public function attributes(){
return $this->belongsToMany('App\Models\Attribute');
}
public function categories(){
return $this->belongsToMany('App\Models\Category');
}
Категория
public function products(){
return $this->belongsToMany('App\Models\Product');
}
Я могу получить все атрибуты связан с продуктом в данной категории с помощью приведенного ниже запроса.
Attribute::where('filterable', '=', 1)
->whereHas('products.categories', function (Builder $query) use ($category) {
$query->where('category_product.category_id', '=', $category->id);
})->get();
Однако я не могу понять, как мне получить количество продуктов.
Я начал тестировать конструктор запросов, чтобы добиться этого, но условие, в котором сводная таблица, по-видимому, связывает attribute_product.attribute_id как строковое значение вместо значения столбца.
$data = DB::table('attributes')->where('filterable', '=', true)
->whereExists(function ($query) {
$query->select('*')->from('products')
->join('attribute_product', function ($join){
$join->on('products.id', '=', 'attribute_product.product_id');
})->where('attributes.id', '=', 'attribute_product.attribute_id');
})->get();
Ниже приведен более или менее окончательный запрос SQL, который нужно отправить в базу данных
select `attributes`.*,
(SELECT
count(*) from `products`
inner join `attribute_product` on `products`.`id` = `attribute_product`.`product_id`
where `attributes`.`id` = `attribute_product`.`attribute_id`) as `products_count`
from `attributes` where `filterable` = 1
and EXISTS
(select * from `products` inner join `attribute_product` on `products`.`id` = `attribute_product`.`product_id`
where `attributes`.`id` = `attribute_product`.`attribute_id`
and EXISTS
(select * from `categories` inner join `category_product` on `categories`.`id` = `category_product`.`category_id`
where `products`.`id` = `category_product`.`product_id` and `category_product`.`category_id` = 9))
Пожалуйста, кто-нибудь, задница Мне нужно получить атрибуты с соответствующим счетчиком продуктов laravel.