2017-01-19 2 views
0

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

Это моя таблица схема: Attributes tables diagram

Я хочу создать массив (Eloquent вернулся Object), как это:

$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

вызова 'ToArray()' на коллекции суб? –

+0

Нет. Это не тот случай. Я хочу получить массив hirarchy, как в приведенном выше коде. – Buglinjo

+0

Для 'AttributeOption' я не вижу' attribute_options' в схеме? –

ответ

1

Есть ли какая-либо конкретная причина, по которой вы запрашиваете модель 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(); 
Смежные вопросы