У меня есть продукты, атрибуты и категории. Я хочу создать собственный массив атрибутов без использования 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
, Заранее спасибо.
Есть ли какая-то конкретная причина, по которой вы запрашиваете 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();
Других решений пока нет …