#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();