【问题标题】:Get all results ids before paginate in Laravel在 Laravel 中分页之前获取所有结果 id
【发布时间】:2020-01-23 01:55:38
【问题描述】:

这是我的代码:

$prestations = Prestation::with([
        'service' => function($query) {
            $query->select(['id','name']);
        },
        'facility' => function($query) {
            $query->select(['id','name']);
        },
        'conciergeries.network' => function($query) {
            $query->select(['id','name']);
        }
    ])
    ->whereHas('service', function ($query) use ($sService) {
        $query->where('name', 'regexp', "/$sService/i");
    })
    ->whereHas('facility', function ($query) use ($sPartner) {
        $query->where('name', 'regexp', "/$sPartner/i");
    })
    ->whereHas('conciergeries.network', function ($query) use ($sSubsidiary) {
        $query->where('name', 'regexp', "/$sSubsidiary/i");
    })
    ->options([
        'collation' => [
            'locale' => 'en_US',
            'strength' => 1
        ]
    ])
    ->where('name', 'regexp', "/$search/i")
    ->orderBy($orderBy, $orderDirection)
    ->paginate(25);

当我尝试获取所有 ID 时:

$arrIds = [];

foreach ($prestations as $prestation) {
    array_push($arrIds, $prestation->_id);
}

问题是我的分页只有 25 个元素的 id。 如何获取所有结果的 id?

【问题讨论】:

    标签: php laravel eloquent pagination


    【解决方案1】:

    您可以将查询保留在 $prestationsQuery 变量上,并像这样调用它 2 次:

    $prestationsQuery = Prestation::with([
            'service:id,name',
            'facility:id,name',
            'conciergeries.network' => function($query) {
                $query->select(['id','name']);
            }
        ])
        ->whereHas('service', function ($query) use ($sService) {
            $query->where('name', 'regexp', "/$sService/i");
        })
        ->whereHas('facility', function ($query) use ($sPartner) {
            $query->where('name', 'regexp', "/$sPartner/i");
        })
        ->whereHas('conciergeries.network', function ($query) use ($sSubsidiary) {
            $query->where('name', 'regexp', "/$sSubsidiary/i");
        })
        ->options([
            'collation' => [
                'locale' => 'en_US',
                'strength' => 1
            ]
        ])
        ->where('name', 'regexp', "/$search/i")
        ->orderBy($orderBy, $orderDirection);
    
    $arrIds = $prestationsQuery->pluck('_id');
    
    $prestations = $prestationsQuery->paginate(25);
    

    记得在pluck之后拨打paginate

    另一种方法是像这样使用tap函数:

    $arrIds = [];
    
    $prestations = Prestation::with([
            'service:id,name',
            'facility:id,name',
            'conciergeries.network' => function($query) {
                $query->select(['id','name']);
            }
        ])
        ->whereHas('service', function ($query) use ($sService) {
            $query->where('name', 'regexp', "/$sService/i");
        })
        ->whereHas('facility', function ($query) use ($sPartner) {
            $query->where('name', 'regexp', "/$sPartner/i");
        })
        ->whereHas('conciergeries.network', function ($query) use ($sSubsidiary) {
            $query->where('name', 'regexp', "/$sSubsidiary/i");
        })
        ->options([
            'collation' => [
                'locale' => 'en_US',
                'strength' => 1
            ]
        ])
        ->where('name', 'regexp', "/$search/i")
        ->orderBy($orderBy, $orderDirection);
        ->tap(function ($query) use (&$arrIds) {
            $arrIds = $query->pluck('_id');
        })
        ->paginate(25);
    

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2015-05-10
      • 1970-01-01
      • 2020-08-21
      • 2020-06-25
      相关资源
      最近更新 更多