Как получить счет из дальних отношений laravel способом? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь получить все атрибуты с количеством продуктов, которые связаны с продуктами в данной категории.

структура таблицы

таблица атрибутов:

| 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.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Проверьте

 withCount('relation_name') 

метод в красноречивом Ex:

 $posts = App\Post::withCount([
    'comments',
    'comments as pending_comments_count' => function (Builder $query) {
    $query->where('approved', false);
    }
])->get();
0 голосов
/ 15 февраля 2020

Мне удалось получить все мои результаты в одном запросе с помощью запроса ниже. Спасибо! @athul для указания направления.

Attribute::where('filterable', '=', 1)->whereHas('products.categories', function (Builder $query) use($category) {
                    $query->where('categories.id', '=', $category->id);
                })
                ->withCount(['products' => function ($query) use($category) {
                    $query->whereHas('categories', function (Builder $query) use ($category) {
                        $query->where('categories.id', '=', $category->id);
                  });
           }])->get();
...