简体   繁体   English

在 Laravel 中分页之前获取所有结果 ID

[英]Get all results ids before paginate in Laravel

Here is my code:这是我的代码:

$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);

When i tried to get all ids:当我试图获取所有 ID 时:

$arrIds = [];

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

The problem is that I get only ids of 25 elements of my pagination.问题是我只得到分页的 25 个元素的 ID。 How to get ids of all results?如何获取所有结果的ID?

You can hold your query on a $prestationsQuery variable and call it 2 times like this:您可以将查询保存在$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);

Remember to call paginate after pluck .记得在pluck之后调用paginate

Another way is to use tap function like this:另一种方法是像这样使用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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM