PHP

Laravel カスタムパラメータありのページネーション

Laravel

 

流れをまとめました。私にしか役に立たないとおも🐱

 

関連

Laravel Paginateを使わないリスト取得

 

Controller

<?php

namespace App\Http\Controllers\Member;

use Illuminate\Http\Request;
use App\Services\GetMembersScoreListService;

class ScoreListController extends BaseController
{
    protected $memberInfo;

    public function __construct()
    {
        parent::__construct();
        $this->memberInfo = (object) session('member');
    }

    /**
     * スコアリスト表示
     *
     * @return View
     */
    public function index(
        Request $request,
        GetMembersScoreListService $getMembersScoreListService
    ) {
        $membersScores = $getMembersScoreListService->execute($request);
        $requestParams = $request->all();

        $departs = Depart::sortNewYear()->isNotDeleted()->get();

        $hintList = (object) [
            'members' => Members::isNotDeleted()->isNotRetiredEmployee()->get(),
            'departs' => $departs,
        ];

        return view('home.status.performanceList', compact(
            'membersScores',
            'requestParams'
        ));
    }

}

 

Service

 

<?php

namespace App\Services;

use App\Services\Service;
use Illuminate\Http\Request;
use App\Repositories\Status\Member\ScoreListRepositoryInterface;

class GetUsersScoreListService
{
    protected $scoreListRepository;

    public function __construct(PerformanceListRepositoryInterface $scoreListRepository)
    {
        $this->scoreListRepository = $scoreListRepository;
    }
    /**
     * スコアデータを返却
     *
     * @return array(object(stdClass))
     */
    public function execute($request)
    {
        return $this->scoreListRepository->execute($request);
    }
}

 

Interface

 

<?php

namespace App\Repositories\Status\Member;

use Illuminate\Http\Request;

interface ScoreListRepositoryInterface
{
    public function execute($request);
}

 

Repository

 

 

<?php

namespace App\Repositories\Status\Member;

use App\Http\Models\Members;
use App\Repositories\Status\Member\ScoreListRepositoryInterface;
use Illuminate\Support\Facades\DB;

class ScoreListRepository implements ScoreListRepositoryInterface
{
    const DEFAULT_LIST_PAGINATE_AMOUNT = 20;
    const FIRST_INDEX = 1;


    public function execute($request = null)
    {
        return self::getMembersWithDepartment($request);
    }

    /**
     * スコアデータ返却
     *
     * @return Illuminate\Pagination\LengthAwarePaginator
     */
    private function getMembersWithDepartment($request)
    {
        $sectionNames = array();
        $memberReps = array();
        $memberRoles = array();
        $sectionNames = array();
        $pagesize = self::DEFAULT_LIST_PAGINATE_AMOUNT;

        $query = Members::query()->where(function ($query) {
            return $query->where('tb_member.deleted', '=', '0');
        });

        if (!isset($request)) {
            return 'データが不正です。<br/><a href="/">ホームへ戻る</a>';
        }
        $requestParams = $request->query();
        if (isset($requestParams)) {
            $sectionNames = $requestParams['section_name'];
            $memberReps = $requestParams['reps'];
            $memberRoles = $requestParams['roles'];
            $pagesize = $requestParams['pagesize'];

            if (isset($requestParams['reps'][self::FIRST_INDEX])) {
                $query->filterFullnames($memberReps);
            }
            if (isset($requestParams['roles'][self::FIRST_INDEX])) {
                $query->filterRoles($memberRoles);
            }
        }

        $subQuery = DB::table('tb_member_section')
                                  ->select('member_id', 'section_id', 'created')
                                  ->where('deleted', '=', '0')
                                  ->whereRaw('created = (
                                                  SELECT
                                                    MAX(created)
                                                  FROM
                                                    tb_member_section AS tmp_tb_member_section
                                                  WHERE tb_member_section.member_id = tmp_tb_member_section.member_id
                                                  AND tb_member_section.deleted = 0
                                              )
                                  ');

        // メインクエリ実行
        return $query->select(
                                'tb_member.member_id',
                                'tb_member.fullname',
                                'tb_member.score',
                                'tb_section.section_name'
                                )->join(DB::raw('('. $subQuery->toSql() .') as ud'), function ($join) {
                                    $join->on('tb_member.member_id','=','ud.member_id');
                                })
                                ->mergeBindings($subQuery)
                                ->leftjoin('tb_section', function ($join) {
                                    $join->on('tb_section.section_id', '=', 'ud.section_id')
                                        ->where('tb_section.deleted', '=', '0');
                                })
                                ->when(isset($sectionNames[self::FIRST_INDEX]), function($query) use ($sectionNames) {
                                    return $query->whereIn('section_name', $sectionNames);
                                })
                                ->groupBy('ud.member_id')
                                ->paginate($pagesize);
    }
}

 

サービスプロバイダ

app/Providers/RepositoryServiceProvider.php

 

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            \App\Repositories\Status\Member\ScoreListRepositoryInterface::class,
            \App\Repositories\Status\Member\ScoreListRepository::class
        );
    }
}

 

 

app/Providers/ScoreServiceProvider.php

 

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ScoreServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            \App\Services\GetUsersScoreListService::class,
            function ($app) {
                return new \App\Services\GetUsersScoreListService(
                    $app->make('\App\Repositories\Status\Member\ScoreListRepositoryInterface')
                );
            }
        );
    }
}

 

サービスとリポジトリを登録します。

config/app.php

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Application Service Providers...
         */
        App\Providers\RepositoryServiceProvider::class, ←●追加
        App\Providers\ScoreServiceProvider::class, ←●追加

 

クラス再読み込み

$ composer dumpa

 

 

View ページネーション

 

<div class="list-paginate">
    <div class="pages horizontal_pagenate">
        <div>{{ $membersScores->total() }}件中 {{ $membersScores->firstItem() }}〜{{ $membersScores->lastItem() }}件</div> 
        {{ $membersScores->appends($requestParams)->links() }}
    </div>
</div>



<div id="score_table">
    <table  cellspacing="0" cellpadding="0" class="table_box sortable">
        <thead>
            <tr>
                <th>メンバー名</th>
                <th>部署</th>
                <th>スコア</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($usersScores as $usersScore)
                <tr>
                    <td>{{ $usersScore->fullname }}</td>
                    <td>{{ $usersScore->section }}円</td>
                    <td>{{ $usersScore->score }}円</td>
                </tr>
            @endforeach
        </tbody>
    </table>
</div>

{{ $membersScores->appends($requestParams)->links() }}

appendsを利用することでパラメータを付与できます。

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)