如何在mongodb / PHP中使用多个参数过滤项目(产品)?

时间:2016-12-22 13:03:09

标签: php mongodb laravel laravel-5 mongodb-query

我正在使用mongodb和laravel(php框架)。

使用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()不应该静态调用

让我用例子解释一下:

网址http://localhost/use_good_store/public/search-item brand_name = Bajaj

如果我发布上面的url它会给我完美的结果但是如果我传递的更多一个参数就像 http://localhost/use_good_store/public/search-item brand_name = Bajaj& model =拳击手它给我上面的错误。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

尝试这样做:

$items = new item();

foreach($item as $key => $value){
   $items = $items->where($key, '=', $value);
}
$items = $items->get();

答案 1 :(得分:1)

我会在此代码中更改一些内容。

首先,为了解决您收到的错误,您无法正确访问搜索方法。它是一个实例方法,而不是一个类(或静态)方法。

因此,$this->item::search_items($item)应该是$this->item->search_items($item)而不是$items

但我不建议这样做。由于您仍在使用该模型,请继续并在其上存储静态搜索方法以供将来使用。将它作为实例方法并没有多大意义;你无法在一个实例上调用它,因为它的目的是找到许多其他实例。

此外,由于您不断更换for循环中的where()值,因此您的查询可能无法以您希望的方式运行。如果你打算使用QueryBuilder,你可以整天不断添加searchItems()条款。

为此,我建议添加一个静态//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); } 方法,该方法返回一个查询结果,然后在控制器中将其转换为JSON,如下所示:

{{1}}

值得注意;您的搜索方法将排除任何与所提供的键/值不匹配的记录。