Laravelのネットで情報を探しにくいピンポイント実装集
233 回閲覧されました
みなさんこんにちは、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"
]
・
・
・
これを使えばビューでユーザーの情報を簡単に使うことができます。
ルーティングからコントローラーに変数を2つ渡す
ルーティングからコントローラーに2つの変数を渡して2つの変数それぞれを違うモデルに適用します。
web.phpが下記になっていたとします。
Route::controller(TicketController::class)->group(function(){
Route::get('/project/{project}/tickets/view/{id}', 'view')->name('ticket.view');
});
変数は「project」と「id」です。
モデル(Ticket)のコードを下記にします。
use App\Models\Project; //他のモデルを使う為に記述
・
・
・
public static function TicketView($project, $id) {
$project = Project::find($project);
$ticket = self::find($id);
return compact('project', 'ticket');
}
コントローラーのコードを下記にします。
public function view($project_id, $ticket_id)
{
$project_ticket_data = Ticket::TicketView($project_id, $ticket_id);
$project = $project_ticket_data['project'];
$ticket = $project_ticket_data['ticket'];
return view('ticket.view', compact('project', 'ticket'));
}
5行目でProjectモデルを使ってデータを取得して6行目でTicketモデルを使ってデータを取得しています。
例えば「$project_ticket_data[‘project’];」でProjectモデルの情報を取得できるのは$project_ticket_dataにdd関数を使えば分かります。
public function view($project_id, $ticket_id)
{
$project_ticket_data = Ticket::TicketView($project_id, $ticket_id);
dd($project_ticket_data);
return view('ticket.view', compact('project', 'ticket'));
}
//結果
array:2 [▼
"project" => App\Models\Project {#1537 ▶}
"ticket" => App\Models\Ticket {#1544 ▶}
]