【问题标题】:Conditional Query & Pagination in Laravel 7Laravel 7 中的条件查询和分页
【发布时间】:2020-11-22 15:07:51
【问题描述】:

$vistors 将返回 vistors 表中的所有数据

我希望在客户端请求$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());
}

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

使用数组上的QueryString()调用成员函数

结果

这是完美的工作

  • ✅http://app.test/visitor?interval=day
  • ✅http://app.test/visitor?interval=week
  • ✅http://app.test/visitor?interval=month
  • ✅http://app.test/visitor?interval=year

这根本不起作用

  • ❌http://app.test/visitor?interval=week&hideMe=true

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

【问题讨论】:

  • 到达方法的路由是什么?
  • 我添加了路线Route::get('/visitor','VisitorController@index');
  • 你能展示一下索引方法是如何初始化的吗? IE 如何将$inputs 变量放入hideme() 方法中?这是在index() 内吗?
  • 我将分享我的整个 index() 和我的 VisitorController 以加载该视图。
  • 你得到 $hideMe 参数了吗?

标签: php laravel eloquent pagination laravel-7


【解决方案1】:

这是因为如果触发了hideMe(),则$visitor 是array,否则为LengthAwarePaginator。 withQueryString 是AbstractPaginator 的一个方法。因此,如果 $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);

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

附:只是一个经验法则,在 Laravel 中始终使用 Collections 而不是 PHP 数组,除非您想轻松地对方法参数进行单元测试。

【讨论】:

  • @cyber8200 嗯...根据我目前所知道的信息,我不确定。但是,如果您认为您的查询存在另一个问题,而不是如何对查询结果进行分页,则可以提出另一个问题并包含查询和一些包含不应出现在结果中的行的示例数据。
【解决方案2】:

我了解您试图对 $inputs 变量执行的操作。在更传统的基于 Laravel 路由/控制器集合的路径中加载信息可能更容易。

尝试使用参数添加路线:

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

然后上索引:

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

或者,如果您不想这样做,您可能会发现使用 request() 帮助器直接使用集合而不是传递给新的数组变量,在 index 方法而不是另一个函数中会有所缓解在那个方法里面:

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

【讨论】:

  • 你确定这是答案吗?
  • 是的,它肯定是其中的一部分。这是一种比在函数中包含函数更简洁的方法。直接使用助手也很方便。然后,按照 Daniel 的建议使用 whereIn() 查询,它将起作用。在进行查询之前,您有几个问题需要改进,这就是我在上面的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2021-12-21
  • 2020-10-24
  • 2020-09-19
  • 2015-05-01
  • 2016-11-06
  • 2020-12-31
相关资源
最近更新 更多