Laravel Yajra DataTables手动过滤

时间:2018-10-12 14:08:38

标签: laravel datatable eloquent yajra-datatable

在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调用的我的过滤方法。

任何帮助,将不胜感激。

0 个答案:

没有答案