Как получить все уникальные атрибуты у коллекции через связь many-to-many?

Рейтинг: 0Ответов: 1Опубликовано: 27.07.2023

Кажется я написал в вопросе чушь)) Но постараюсь объяснить подробнее. Реализую на laravel. Мне нужно получить все доступные атрибуты "цвет" у коллекции товаров. Я делаю вот так (связь многие-ко-многим через промежуточную таблицу):

$colors = $products->pluck('colors')
   ->unique();

Но так не работает. Потому как в таком случае unique применяется к первым вложенным коллекциям (а то сами товары), а у каждого товара своя вложенная коллекция атрибута "цвет".

То есть, если вызвать dd($products), то получаю так (Лишнее убрал для читабельности):

Illuminate\Pagination\LengthAwarePaginator {#1594 ▼
  #total: 7
  #items: Illuminate\Database\Eloquent\Collection {#1814 ▼
    #items: array:7 [▼
      0 => App\Models\Product {#1681 ▼
        #fillable: array:17 [▶]
        ...
        #attributes: array:20 [▶]
        ...
        #relations: array:9 [▼
          "colors" => Illuminate\Database\Eloquent\Collection {#1760 ▼
            #items: array:2 [▼
              0 => App\Models\Color {#1782 ▼
                ...
                #attributes: array:12 [▼
                  "id" => 1
                  "name" => "синий"
                  "title" => "siniy"
                ]
              ...
              1 => App\Models\Color {#1778 ▼
                ...
                #attributes: array:12 [▼
                  "id" => 3
                  "name" => "красный"
                  "title" => "krasnyy"
                ]
              ...
      1 => App\Models\Product {#1649 ▶}
...

У каждого товара есть цвет. У кого-то указан, у кого-то не указан, у кого-то указано несколько. Мне нужно получить уникальные цвета (с id, title, name) без повторений.

Как мне правильно это реализовать?

Ответы

▲ 0Принят
$availableColors = $products->pluck('colors')
            ->filter(function($value, $key) {
                return  $value != '[]';
            })
            ->collapse()
            ->sortBy('name')
            ->unique('title');