Blogブログ

laravel

2023.07.10

php8.1からひょこっと現れたenumはlaravelで必須ですよ

例えば、もう大体modelが出来上がっているときに、

自分がお気に入りをした求人の一覧ページを

作るということを例にenumを説明していきましょう。

まずはroutingから

Route::group([
    'namespace'     => 'App\\Http\\Controllers\\User',
    'as'            => 'user.',
    'middleware'    => 'user.init_common_resource'
], function (Router $router) {
// マイページ
    $router->controller(MypageController::class)->prefix('mypage')->as('mypage.')->middleware('user.auth')->group(function (Router $router) {
        $router->get('/', 'index')->name('home');
        $router->namespace('MyPage')->group(function (Router $router) {
            $router->controller(LikeController::class)->as('like.')->group(function (Router $router) {
                $router->get('/like', 'index')->name('index');
            });
        });
 });

まぁこんな感じで、user.mypage.like.indexを作りました。

というわけで、 コントローラーを作っていきます。

mypage/like/index.blade.phpに

@extends('user.layout.app')

@section('content')
//ここに一覧のコード書く
@endsection

$likejobsを展開して求人カセットを表示するようにしたいので、

コントローラーの方で、

$likejobsを取得していきます。

が、その前にserviceでデータを取得するためにserviceを作ります。

<?php

namespace App\\Services\\User;

use App\\Models\\KeptJob;
use App\\Models\\User;
use App\\Repositories\\User\\Job\\JobRepositoryInterface;
use App\\Repositories\\User\\KeptJob\\KeptJobRepositoryInterface;
use App\\Repositories\\User\\UserRepositoryInterface;
use Exception;
use Illuminate\\Support\\Collection;

class JobService
{
    private $jobRepository;

    private $keptJobRepository;

    private $userRepository;

    public function __construct(
        JobRepositoryInterface $jobRepository,
        KeptJobRepositoryInterface $keptJobRepository,
        UserRepositoryInterface $userRepository
    ) {
        $this->jobRepository = $jobRepository;
        $this->keptJobRepository = $keptJobRepository;
        $this->userRepository = $userRepository;
    }

    }
    /**
     * キープ求人取得
     *
     * @param integer $userId
     * @param integer $jobId
     * @return object
     */
    public function getKeepJobs(int $userId)
    {
        return KeptJob::where('user_id', $userId)->get();
    }
}

ここのgetKeepJobsでmodelから取ってきます。

ちなみに、modelとして、

use App\Models\KeptJob;を読み込んでいるのですが、

ここでjobテーブルにbelongToしています。

そしてそのjobテーブルを見ると。

<?php

namespace App\\Models;

use App\\Enums\\EmploymentType;
use App\\Enums\\JobCategory;
use App\\Enums\\JobStatus;
use App\\Enums\\SalaryType;
use Illuminate\\Database\\Eloquent\\Builder;
use Illuminate\\Database\\Eloquent\\Relations\\BelongsTo;

class Job extends BaseModel
{
    protected $table = 'jobs';

    protected $casts = [
        'job_category' => JobCategory::class,
        'employment_type' => EmploymentType::class,
        'salary_type' => SalaryType::class,
        'status' => JobStatus::class,
    ];

    protected $fillable = [
        'f_job_id',
        'nursery_id',
        'job_category',
        'employment_type',
        'title',
        'salary_type',
        'salary_bottom',
        'salary_high',
        'start_date',
        'end_date',
        'status',
    ];

enum読み込んでるううーー!!!

use App\Enums\EmploymentType;って読み込んでるーー!!!

というわけで、

これを見てみましょう。

app/Enum/EmploymentType.phpは、

<?php

declare(strict_types=1);

namespace App\\Enums;

enum EmploymentType: int
{
    case Unknown    = 0;
    case Fulltime   = 1;
    case PartTime   = 2;
    case Contract   = 3;
    case Dispatch   = 4;
    case TempToPerm = 5;

    /**
     * 雇用形態の名前を取得
     *
     * @return string
     */
    public function text(): string
    {
        return match ($this) {
            self::Unknown    => '不明',
            self::Fulltime   => '正社員',
            self::PartTime   => 'パート・アルバイト',
            self::Contract   => '契約社員',
            self::Dispatch   => '派遣',
            self::TempToPerm => '紹介予定派遣',
        };
    }
}

と、定義してあります。

こう定義しておくと

→text()でキーから文字列を表示してくれるようになります。

どういうことかというと・・。

まずコントローラーを見ましょう。

<?php

namespace App\\Http\\Controllers\\User\\Mypage;

use App\\Http\\Controllers\\User\\BaseController;
use App\\Http\\Requests\\User\\Password\\UpdatePasswordRequest;
use App\\Services\\User\\UserService;
use App\\Services\\User\\JobService;

class LikeController extends BaseController
{
  protected $userService;

  public function __construct(
    UserService $userService,
    JobService $jobService
  ) {
    $this->userService = $userService;
    $this->jobService = $jobService;
  }

  public function index()
  {
    $user = $this->user();

    $likeJobs = $this->jobService->getKeepJobs($user->id);
    return view('user.mypage.like.index', compact('likeJobs'));
  }
}

はい、これはもうviewを見るしかないですよね。

では、問題の場所を見てみましょう。

@foreach($likeJobs as $likejob)

  @foreach($likejob->job->nursery->facilityTypes as $facility)
    <li class="top_pickup_item">{{$facility->name}}</li>
  @endforeach
  <li class="top_pickup_item">{{$likejob->job->employment_type->text()}}</li>
  {{$likejob->job->title}}
  {{$likejob->job->nursery->prefecture->name}}<br>
  {{$likejob->job->nursery->city->name}}{{$likejob->job->nursery->street_address}}
     
@endforeach

ここで、

コントローラーでlikejobを渡してるのでそれをオブジェクトとして使ってるのはいいとして、

見るべきは

{{$likejob->job->employment_type->text()}}

です。

$likejobがbelongToしてjobテーブルの中でemploy_typeがありますが、 それをEnumで定義してるので→text()と書くだけで、文字の状態にして表示してくれます。

すごいね


ちなみにこのコードはN+1問題があるので次のブログで解決していきます

余談ですが
今はlaravel10です。
その基本的な構築はこちらの記事で解説してます。