Предотвратите повторение цикла foreach-laravel

#php #laravel #for-loop

Вопрос:

Я получаю услуги из нашей базы данных с помощью кода

 'services' =>  Service::with('seller.user', 'seller.level', 'subcategory')
            ->whereHas('seller', function ($query) {
                return   $query->where('status', 'active');
            })
            ->Where('tags', 'like', '%' . $this->tag . '%')
            ->withAvg('review', 'rating')
            ->withCount('review')
            ->paginate(20)
 

Как игнорировать повторяющиеся подкатегории в цикле

  @foreach ($services as $service)
        $service->subcategory->name
        @endforeach
 

Я получаю много повторяющихся подкатегорий

Мне нужна подробная информация о подкатегории, а не только название

отношения

 class Service extends Model
{
    public function subcategory()
    {
        return $this->belongsTo(Subcategory::class);
    }
}

class Subcategory extends Model
{
    public function service()
    {
        return $this->hasMany(Service::class);
    }
}
 

обслуживание столов

 Schema::create('services', function (Blueprint $table) {
        $table->id();
        $table->foreignId('seller_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
        $table->foreignId('subcategory_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
        $table->string('title')->nullable();
        $table->string('slug')->nullable();
        $table->float('price')->nullable();
        $table->json('tags')->nullable();
    }
 

подкатегория таблицы

   Schema::create('subcategories', function (Blueprint $table) {
        $table->id();
        $table->foreignId('category_id')->constrained()->onDelete('cascade')->onUpdate('cascade');
        $table->string('name');
    }
 

Ответ №1:

Вы можете попробовать следующий способ:

 @php
$subcategories = array();
foreach ($services as $key => $service) {
    array_push($subcategories, $service->subcategory->name);
}
$subcategories = array_unique($subcategories);
@endphp
@foreach ($subcategories as $key => $subcategory)
    {{ $subcategory }}
@endforeach
 

Комментарии:

1. Спасибо, но мне нужна подробная информация о подкатегории, а не только название

2. Итак, где же данные, которые вы не хотите повторять?

Ответ №2:

Получайте только уникальные идентификаторы или уникальное имя. Может отличаться в зависимости от вашей базы данных.

 'services' =>  Service::with('seller.user', 'seller.level',
 'subcategory' => function($query) {
          $query->get()->unique('name')
      })
       ->whereHas('seller', function ($query) {
            return   $query->where('status', 'active');
        })
        ->Where('tags', 'like', '%' . $this->tag . '%')
        ->withAvg('review', 'rating')
        ->withCount('review')
        ->paginate(20);
 

Также можно использовать следующие методы

  1. ->distinct('name')->get();
  2. ->distinct()->get(['name']);

Для получения дополнительной информации проверьте Агрегирование Связанных Моделей

Комментарии:

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

2. не могли бы вы, пожалуйста, обновить вопрос со структурой и отношениями таблиц БД