Как отфильтровать элемент (продукт) с несколькими параметрами в mongodb / PHP?
Я использую mongodb с laravel (php framework).
Используя метод post, я отправляю параметр фильтра в функцию контроллера.
ItemController.php
public function search_item(Request $request){
$item = $request->all();
$item = $this->item->search_item($item);
return response()->json($item,200);
}
Item.php (файл модели)
public function search_item($item){
$items = new item();
foreach($item as $key => $value) {
$items = $items::where($key, '=', $value)->get();
}
$items = json_decode(json_encode($pro));
return $items;
}
Если я передаю только один параметр, это дает мне отличный результат, но если я передаю больше, чем один параметр, это дает мне ошибку.
Нестатический метод Illuminate\Support\Collection::where() не должен вызываться статически
Позвольте мне объяснить с примером:
URL: http://localhost/use_good_store/public/search-item?BRAND_NAME = Баджадж
если я опубликую выше URL, это даст мне идеальный результат, но если я передам более одного параметра, например http://localhost/use_good_store/public/search-item?brand_name=Bajaj & model = Boxer, это даст мне ошибку выше.
Любая помощь будет оценена!
2 ответа
Попробуйте сделать это так:
$items = new item();
foreach($item as $key => $value){
$items = $items->where($key, '=', $value);
}
$items = $items->get();
Есть несколько вещей, которые я бы изменил в этом коде.
Во-первых, чтобы устранить полученную ошибку, вы неправильно используете метод поиска. Это метод экземпляра, а не метод класса (или статический).
Так что вместо $this->item::search_items($item)
, так должно быть $this->item->search_items($item)
,
Но я бы не рекомендовал это. Так как вы все равно используете модель, сохраните статический метод поиска для дальнейшего использования. Не имеет особого смысла для него быть методом экземпляра; Вы не можете действительно вызвать его в экземпляре, потому что смысл в том, чтобы найти много других экземпляров.
Кроме того, ваш запрос, вероятно, не будет работать так, как вы хотите, так как вы постоянно заменяете $items
значение в цикле for. если вы собираетесь использовать QueryBuilder, вы можете просто продолжать добавлять where()
пункты к нему весь день.
Для этого я бы рекомендовал добавить статический searchItems()
метод, который возвращает результаты запроса, который вы затем преобразовали бы в JSON в вашем контроллере, например так:
//Item.php model
public static function searchItems($itemSearchAttributes)
{
return static::where(function($query) use ($itemSearchAttributes){
foreach ($itemSearchAttributes as $key => $value){
$query->where($key, '=', $value);
}
})->get();
}
//ItemController.php handler method
public function search_item(Request $request){
$items = Item::searchItems($request->all());
return $response->json($items);
}
Стоит отметить; Ваш метод поиска здесь исключит любые записи, которые не соответствуют -all- из предоставленных ключа / значений.