Laravelのネットで情報を探しにくいピンポイント実装集

Laravelのネットで情報を探しにくいピンポイント実装集

56 回閲覧されました

みなさんこんにちは、jonioです。

プログラムを書いているとネットで探しにくい情報があります。

そういう時はChatGTPを使うのですが平気で嘘の回答が帰ってきて100%の信頼ができません。

ネットで他の内容を検索している時に見つけたりChatGTPの回答をいじって実装できた内容を掲載します。

新しく見つけた内容があり次第情報を追加します。

編集フォームのチェックボタンで論理削除

何に対するチェックボタンでもいいですがユーザーの編集画面で存在するかしないかのチェックボックスにチェックをつけるとユーザーが存在してチェックボックスを外すとユーザーが存在しないことにします。

いわゆる論理削除です。

usersテーブルに存在するか・しないかのフラグのカラム(hidden)を用意します。

hiddenカラムはboolean型にします。

マイグレーションファイルは下記になります。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddHiddenToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('hidden')->after('role_type_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('hidden');
        });
    }
}

それではアクションとビューとモデルを見ていきましょう。

usersテーブルにはhiddenカラム以外もありますがそこの解説は今回の記事の対象外なので触れないしコードも掲載しないのでご了承ください。

ビュー

コードを下記にします。

<div class="container ml-auto mr-auto pt-6 pb-6">
  <h2 class="text-center has-text-weight-bold is-size-4">プロフィールの編集</h2>
  <form method="post" action="{{ route('user.update', ['user' => $choiceId]) }}" class="mt-6">
    @csrf
    @method('put')
    <div class="mt-3">
      存在するか : <input type="checkbox" name="hidden" {{ $choiceId->hidden == 1 ? 'checked' : '' }}  class="formName"> 
    </div>
    <div class>
      <button class="button is-link bg-info btn">送信</button>
    </div>
  </form>
</div>

hiddenカラムの値が1にならチェックボックスにチェックが入りそうではない場合はhiddenカラムの値が0になるのは「{{ $choiceId->hidden == 1 ? ‘checked’ : ‘ ‘ }}」の部分に三項演算子を使っています。

モデル

User.phpのコードを下記にします。

public function profileUpdate($request){

  $user = Auth::user();

  $inputs = request()->validate([
    'hidden' => 'nullable'
  ]);
        
  $inputs['hidden'] = $request->has('hidden') ? 1 : 0;

  $user->update($inputs);
}

5行目で「nullable」の設定をしていますがチェックボックスが入っている時と入っていない時を考えないといけないのでnullableに設定しています。

9行目の「$request->has(‘hidden’) ? 1 : 0;」チェックボックスにチェックが入っていたらhiddenカラムの値を1にしてそうでない場合は0にするという意味です。

次はコントローラーです。

コントローラー

public function update(User $user, Request $request){
  $user->profileUpdate($request);

  return redirect('/user/index')->with('message', 'ユーザー情報を編集しました');
}

これで完成です。

ポイント

ビューの「{{ $choiceId->hidden == 1 ? ‘checked’ : ” }}」とモデルの「$request->has(‘hidden’) ? 1 : 0;」です。

編集画面で選択フォームを使って選択した内容に変える

role_typesテーブルに権限のデータを保存してusersテーブルとリレーションしているとします。

ユーザーを編集する時に権限を選択して選択した権限に変えます。

必要なコードしか掲載しませんのでご了承ください。

テーブル

usersテーブルのカラムは下記になります。

role_typesテーブルは下記になります。

コントローラー

アクションのコードは下記になります。

public function edit($id){
  $choiceId = User::find($id);

  $roleTypes = RoleType::pluck('role_type', 'id');

  return view('user.edit', compact('choiceId', 'roleTypes'));
}

4行目の「pluck(‘role_type’, ‘id’)」はkeyをidにしてvalueをrole_typeにしています。

ちなみにdd関数を使うとデータを取得できているのを確認できます。




$roleTypes = RoleType::pluck('role_type', 'id');
dd($roleTypes);



                    

//取得結果
Illuminate\Support\Collection {#1490
  #items: array:2 [▼
    1 => "管理者"
    2 => "一般ユーザー"
  ]
  #escapeWhenCastingToString: false
}

idカラムの値をテーブルに登録するのと選択フォームにvalueの値を使いたいのでpluckを使いました。

ビュー

コードを下記にします。

<form method="post" action="{{ route('user.update', ['user' => $choiceId]) }}" class="mt-6">
  @csrf
  @method('put')
  <div class="mb-3">
    <label for="role_type" class="formName">権限</label>
    <select name="role_type_id" id="">
      @foreach($roleTypes as $id => $role_type)
        <option value="{{ $id }}" {{ $id == old('role_type_id', $choiceId->role_type_id) ? 'selected' : '' }}>{{ $role_type }}</option>
       @endforeach
    </select>
  </div>
  <div>
    <button class="button is-link bg-info btn">送信</button>
  </div>
</form>

後は更新の処理を書けば権限の変更ができます。

ルーティングを使ってユーザー情報を取得

web.phpに例えば下記を記述したとします。

Route::controller(UserController::class)->group(function(){
  Route::get('/user/{user}/userEdit', 'userEdit')->name('user.userEdit');
});

「{user}」はモデル名です、モデル名の最初の文字を小文字にします。

ビューへのリンクを下記にします。

<a href="{{ route('user.userEdit', ['user' => $user->id]) }}" class="link">編集</a>

web.phpの「user」に対してコントローラーのアクションでdd関数を使うとユーザー情報をオブジェクトで取得できます。

public function userEdit(User $user)
{
  dd($user);           //←これ
       
  return view('user.userEdit', compact('user'));
}


//結果
App\Models\User {#1533
  #connection: "mysql"
  #table: "users"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  +preventsLazyLoading: false
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #escapeWhenCastingToString: false
  #attributes: array:10 [▼
    "id" => 1
    "name" => "jonio"
    "email" => "xxxxxxgmail.com"
    "role_type_id" => 1
    "hidden" => 1
    "email_verified_at" => null
    "password" => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    "remember_token" => "xxxxxxxxxxxxxxxxxxxxxxxx"
    "created_at" => "2024-04-22 21:01:58"
    "updated_at" => "2024-04-24 21:28:02"
  ]


これを使えばビューでユーザーの情報を簡単に使うことができます。