如何过滤产品(laravel)

时间:2018-01-08 20:47:21

标签: php laravel

我做网上商店。我有3个页面,其中产品的过滤器类似 - 目录页面,父类别页面和子类别页面

site/catalog/  // catalogController@index
site/catalog/parentCategory/childrenCategory //childrenCategoryController@index
site/catalog/parentCategory //parentCategoryController@index

过滤器是通过get请求制作的,例如:site/catalog?price_from=1&price_to=9999&color=red。如何使这个过滤器成为一个单独的功能?在产品型号中制作它会有好处吗?以及如何使用它?我认为它应该是一个接受2个参数(请求参数和当前查询模型)并返回$this的函数。

控制器中的代码:

$products = Product::filter($products, $request)->paginate(20);     

型号:

public function filter($model, Request $request) {
        if ($request->has('price_from')) {
            $model->where('price', '>', $request->get('price_from'));
        }
        if ($request->has('color')) {
            $model->where('color', '>', $request->get('color'));
        }

        return $model;
    }

但怎么做对了?如何在控制器代码中传递当前$products

3 个答案:

答案 0 :(得分:3)

您可以创建local scope。类似的东西:

public function scopeFilter($q)
{
    if (request('price_from')) {
        $q->where('price', '>', request('price_from'));
    }
    if (request('color')) {
        $q->where('color', '>', request('color'));
    }

    return $q;
}

然后使用它:

Product::filter()->paginate(20);

答案 1 :(得分:0)

最近不得不做这样的事情,这是我的整个 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Product; class ProductsController extends Controller { public function index(Request $request) { $products = Product::all(); if ($request->type) { $products = $products->whereIn('type', $request->type); } if ($request->gender) { $products = $products->whereIn('gender', $request->gender); } return $products; 文件:

whereIn()

`

您可以继续添加并根据需要进行过滤,这对我来说就像是一种魅力,请注意,我使用MODULE_DIR = os.path.dirname(__file__) LOG_FILE = os.path.join(MODULE_DIR, 'my_test.log') LOG_FMT = logging.Formatter('%(asctime)s [%(levelname)8s]: %(message)s') LOG = logging.getLogger() LOG.setLevel(logging.INFO) fh = logging.FileHandler(LOG_FILE) fh.setFormatter(LOG_FMT) fh.setLevel(logging.INFO) LOG.addHandler(fh) ch = logging.StreamHandler(sys.stdout) ch.setFormatter(LOG_FMT) ch.setLevel(logging.INFO) LOG.addHandler(ch) 是因为请求的数据是以数组形式输入的,希望对您有所帮助。

答案 2 :(得分:0)

我有一个类似的问题。我想使函数的每个位置名称使用不同的过滤器。现在,我必须为每个过滤器创建两个函数。我正在尝试做这样的事情:

public function chooseLocation($id)
        {
            $locations = Location::find($id);
            $orders = Order::all();

        if($location_name = NewYork ){
            $locations = $locations->where('location', '=', 'New York')->whereRaw('Date(created_at) = CURDATE()')->get();
        }
        if($locations = NC){
            $locations = $locations->where('location', '=', 'NC')->whereRaw('Date(created_at) = CURDATE()')->get();
        }
    }

我要在一个函数中创建两个过滤器。不像现在。

 public function wallet($id)
{
    $locations = Location::find($id);
    $wallets = Wallet::all();
    $orders = Order::all();
    $orders = Order::where('location', '=', 'Plovdiv')->whereRaw('Date(created_at) = CURDATE()')->get();
    return view('wallet')
    ->with('locations', $locations)
    ->with('orders', $orders)
    ->with('wallets', $wallets);
}
public function wallet2($id)
{
    $locations = Location::find($id);
    $wallets = Wallet::all();
    $orders = Order::all();
    $orders = Order::where('location', '=', 'New York')->whereRaw('Date(created_at) = CURDATE()')->get();
    return view('wallet')
    ->with('locations', $locations)
    ->with('orders', $orders)
    ->with('wallets', $wallets);
}