Как показать категории, к которым относятся товары, имеющие определенный атрибут?

#php #laravel #eloquent

Вопрос:

Category Модель hasMany Products , которую belongsTo имеют a Category , products таблица category_id и type столбцы.

Мне нужно показать только categories тип продуктов, которые имеют определенное значение.

Я попробовал это, но не получил правильных результатов:

 return Category::with('products')->get()->filter(function ($query) {
    return $query->products
        ->where('type_id', 1);
    // or return $query->products->contain('type_id', 1);
});
 

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

1. Постарайтесь на 100% избегать ->get()->filter() и иметь where внутри filter , так как вы получаете ВСЕ модели, вы можете получить модели на 100 тысяч, поэтому вы будете отсчитывать время, потому что не хватает памяти или это займет вечность… Вы записываете это условие фильтра как, где перед получением данных БД на 100000000% более эффективна для этого типа операций.

Ответ №1:

Вы можете использовать метод whereHas() :

 $typeId = 1;
Category::with('products')->whereHas('products', function ($query) use ($typeId) {
    return $query->where('type_id', $typeId);
})->get();
 

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

1. спасибо, но не сработало, это показывает категории, в которых его продукты имеют этот идентификатор типа 1, а также 2,3 и… Мне нужно отфильтровать категории и просто получить товары с идентификатором типа = 1

2. измените $typeId = 1; на $typeId = "1"; , надеюсь, это сработает

3. Я попробовал это и показал мне только продукты, а не категории: возвращаемая категория::с(‘продукты’)->get()->>flatMap(функция ($q){ возврат $q->>>продукты->>>>где(‘type_id’, 1); });

4. даже я изменил столбец type_id на тип со строковыми значениями «маленький», «большой» и»… но не могу получить то, что мне нужно. возвращаемая категория::с(«продукты»)->Где(«продукты», функция ($запрос) { возвращаемый $запрос->>где(«тип», «маленький»); })->>>получить();

Ответ №2:

Я нашел рабочий ответ:

     return Category::with(['products' => function ($q) {
        return $q->where('type', "small");
    }])->whereHas('products')->get();