在Laravel应用程序中,我使用Yajra的DataTables处理数据集的分页。该表用于显示应用中其他位置排除的许多产品。
可以通过我可以包含在where子句中的简单设置来排除它们。排除产品的另一组规则要先进一些,并且具有我称之为的功能。一切正常,但是,例如,如果我希望每页10个产品,那么第一页只显示7个产品,因为它需要10个产品,但其中只有7个被排除在外。
是否可以将函数包含在where子句中(我认为这不太可能),或者可以通过某种方式确保我的应用正确使用分页和表长度?
<?php
function filteringMethod(Request $request)
{
$type = $request->get('type');
$channel = $request->get('channel');
$sortData = $this->getSortingData();
$data = [];
$store = access()->getCurrentStore();
$website = $store->website;
$helper = new CommandHelper($store, $channel);
$products = Product::where([
['website_id', '=', $website->website_id],
['store_view_id', '=', $store->defaultStoreView()->store_view_id],
])
->limit($sortData['length'])
->offset($sortData['offset'])
->orderBy('store_data_product_id')
->get();
$fullCount = Product::where([
['website_id', '=', $website->website_id],
['store_view_id', '=', $store->defaultStoreView()->store_view_id],
])->count();
foreach ($products as $product) {
$reasons = [];
$includeReasons = [];
if ($helper->maybeExcludeVariant($product, $type, $reasons)) {
$productArray = $product->toArray();
sort($reasons);
if ($helper->maybeExcludeVariant($product, ProductFilters::TYPE_WHITELIST, $includeReasons)) {
sort($includeReasons);
$reasons[] = '';
$reasons = array_merge($reasons, $includeReasons);
}
$productArray['reason'] = implode("<br>", $reasons);
$data[] = $productArray;
}
}
if (!empty($data)) {
for ($i = 0; $i < count($data); $i++) {
$data[$i]['name_long'] =
$data[$i]['name_long'] . (!empty($data[$i]['name_variant']) && $data[$i]['name_variant'] !== 'Default' ?
' ' . $data[$i]['name_variant'] : '');
$data[$i]['price_excl'] =
Number::money($data[$i]['price_excl'], $store->defaultStoreView()->default_currency);
$data[$i]['cost_price_excl'] =
Number::money($data[$i]['cost_price_excl'], $store->defaultStoreView()->default_currency);
}
}
/**
* @var \Illuminate\Http\JsonResponse $returnData
*/
$returnData = Datatables::of($data)->rawColumns(['reason'])->make(true);
if (!empty($data)) {
$returnDataData = $returnData->getData();
$returnDataData->recordsFiltered = $fullCount;
$returnDataData->recordsTotal = $fullCount;
$returnData->setData($returnDataData);
}
return $returnData;
}
上面是DataTable调用的我的过滤方法。
任何帮助,将不胜感激。