Laravel 7 中的条件查询和分页

Conditional Query & Pagination in Laravel 7

$vistors 将 return 来自 vistors table

的所有数据

我希望在客户端请求 $inputs['hideMe'] == true 时查询所有访问者是否 $visitor->ip != '127.0.0.1'

查看

http://app.test/visitor?interval=day

路线

Route::get('/visitor','VisitorController@index');

我有

public function index()
{
    $inputs    = Request::all();
    $interval  = '';

    if(array_key_exists('interval', $inputs)){
        $interval  = $inputs['interval'];
    }

    switch ($interval) {
        case 'day':
        $data = Visitor::where('created_at', '>', now()->today())->paginate(15);
        break;
        case 'week':
        $data = Visitor::where('created_at', '>', now()->subWeek())->paginate(15);
        break;
        case 'month':
        $data = Visitor::where('created_at', '>', now()->subMonth())->paginate(15);
        break;
        case 'year':
        $data = Visitor::where('created_at', '>', now()->subYear())->paginate(15);
        break;
        default:
        $data = Visitor::orderBy('updated_at', 'desc')->paginate(15);
        break;
    }




    $visitors = [];
    function hideMe($inputs, $data){

        foreach($data as $i => $visitor){
            if($visitor->ip != '127.0.0.1' || $visitor->ip != '24.62.137.111'){
                $visitors[$i] = $visitor;
            }

        }

    }

    if(array_key_exists('hideMe', $inputs)){
        $hideMe  = $inputs['hideMe'];
        if($hideMe == true){
            hideMe($inputs, $data);
        }
    } else {
        $visitors = $data;
    }


    // dd($visitors);


    return View::make('layouts.be.visitors.index', get_defined_vars());
}

当我这样做时,它似乎不起作用。 因为我在我的视图上使用分页,所以我会一直收到这个错误。

Call to a member function withQueryString() on array

结果

这很完美

这根本不起作用

关于如何向我的查询添加逻辑的任何建议?

我明白你想用 $inputs 变量做什么。在更传统的 Laravel 基于路由/控制器集合的路径中加载信息可能更容易。

尝试使用参数添加路由:

Route::get('/visitor/{interval}/{hideMe}','VisitorController@index');

然后在索引上:

public function index($interval, $hideMe){}

或者,如果您不想这样做,您可能会发现直接使用 request() 助手来使用集合而不是传递给新的数组变量,在 index 方法而不是该方法中的另一个函数:

 $hideMe  = request()->input('hideMe');

那是因为$visitor是一个array,如果hideMe()被触发,否则,它是一个LengthAwarePaginator. withQueryStringAbstractPaginator的一个方法。因此,如果 $visitor 只是原生 PHP array.

,当然你将无法使用 $visitors->withQueryString()

这里的解决方案是在查询构建阶段过滤掉 IP '127.0.0.1''24.62.137.111' 的行。像这样:

    switch ($interval) {
        case 'day':
        $q = Visitor::where('created_at', '>', now()->today());
        break;
        case 'week':
        $q = Visitor::where('created_at', '>', now()->subWeek());
        break;
        case 'month':
        $q = Visitor::where('created_at', '>', now()->subMonth());
        break;
        case 'year':
        $q = Visitor::where('created_at', '>', now()->subYear());
        break;
        default:
        $q = Visitor::orderBy('updated_at', 'desc');
        break;
    }

    if ($inputs['hideMe']) {
        $q = $q->whereNotIn('ip', ['127.0.0.1', '24.62.137.111']);
    }

    $data = $q->paginate(15);

我还没有测试我的代码,但你明白了。

P.S。只是一个经验法则,总是在 Laravel 中使用 Collections 而不是 PHP 数组,除非对于方法参数,如果你想轻松地对它们进行单元测试。