我正在使用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 =拳击手它给我上面的错误。
任何帮助将不胜感激!
答案 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}}
值得注意;您的搜索方法将排除任何与所提供的键/值不匹配的记录。