我做网上商店。我有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
?
答案 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);
}