Как отфильтровать элемент (продукт) с несколькими параметрами в 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- из предоставленных ключа / значений.

Другие вопросы по тегам