Laravel 5.3 получает пользовательский массив (объект) из отношений Eloquent

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

Это моя схема таблицы:
Диаграмма атрибутов таблиц

Я хочу создать массив (Eloquent возвращает объект), как это:

$attributes = [
'attribute1' => [
'attribute1_property1' => 'attribute1_property1_count_in_all_products',
'attribute1_property2' => 'attribute1_property2_count_in_all_products',
'attribute1_property3' => 'attribute1_property3_count_in_all_products',
],
'attribute2' => [
'attribute2_property1' => 'attribute1_property1_count_in_all_products',
'attribute2_property2' => 'attribute1_property2_count_in_all_products',
'attribute2_property3' => 'attribute1_property3_count_in_all_products',
],
...
]

У меня есть модели Product, Attribute, AttributeProperty,

Product::whereHas('categories', function ($q) use ($catId) {
$q->whereId($catId);
})->with('attributeProperties.attribute')->get();

С помощью приведенного выше кода я получаю список продуктов и его параметров атрибута, но я хочу, чтобы параметры атрибута были сгруппированы по родительскому атрибуту и ​​подсчитали, сколько продуктов имеют этот параметр атрибута.

Другими словами, я хочу получить все attribute_options сгруппированы по родителям attribute и посчитал, сколько продуктов сделать это attribute_option иметь на это category, Заранее спасибо.

0

Решение

Есть ли какая-то конкретная причина, по которой вы запрашиваете Product модель? Если это не нужно, и вы только после примера массива, вы можете сделать это следующим образом:

$results = Attribute::with(['attributeProperties' => function($query) {
return $query->withCount('products');
}])->get();

Вы можете получить доступ к тому, что вы хотите через коллекции (я беру первый элемент каждого только для справки):

$attribute = $results->first();
$attributeProperty = $attribute->attributeProperties->first();
$attributeProperty->products_count;

ИЛИ ЖЕ если вам нужно в этом формате EXACT, вы можете отобразить результаты, как:

$results->keyBy('display_name')->map(function($attribute) {
return $attribute->attributeProperties
->keyBy('display_name')
->map(function($property) {
return $poperty->products_count;
})
->toArray();
})
->toArray();
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector