Получить все идентификаторы результатов перед разбиением на страницы в Laravel - PullRequest
0 голосов
/ 22 января 2020

Вот мой код:

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

Когда я пытался получить все идентификаторы:

$arrIds = [];

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

Проблема в том, что я получаю только идентификаторы из 25 элементов моей нумерации страниц. Как получить идентификаторы всех результатов?

1 Ответ

1 голос
/ 22 января 2020

Вы можете удерживать запрос в переменной $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);

Не забудьте вызвать paginate после pluck.

Другой способ это использовать 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);
...