Laravel 初期設定 DB Controller

設定内容

環境

Docker上でのLAMP環境

  • mysql5.7
  • phpmyadmin
  • apache2.4
  • PHP 8.1.11
  • Laravel Framework 8.83.25
  • Laravel Breeze 1系の最新版
タイムゾーン、言語設定
'timezone' => 'Asia/Tokyo',
エラーメッセージなど日本語になる
'locale' => 'ja',
デバッグバー

デバッグバーいれるバージョン指定しないと最新になる

composer require barryvdh/laravel-debugbar:^3.7

インストールされるとcomposer.jsonに記載される
開発環境いがいで表示されるとまずいので、 .envのAPP_DEBUGで表示切り替えをする。

APP_NAME=Umarche
APP_ENV=local
APP_KEY=base64:ljSXcm/0AB383OVd+nwLt5NbwgbWthGimqfArlsoStA=
APP_DEBUG=true
APP_URL=http://localhost

.envファイルにはキャッシュがあるので、すぐ消えなかったら
php artisan cache:clear
php artisan config:clear

DB設定
DB_CONNECTION=mysql
#コンテナ名
DB_HOST=mysql
#内部ポートを指定
DB_PORT=3306
#データベース名
DB_DATABASE=laravel_umarche
#ユーザ名
DB_USERNAME=root
#パスワード
DB_PASSWORD=rootroot
db:
    container_name: mysql
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    environment:
      MYSQL_DATABASE: laravel_umarche
      MYSQL_USER: docker
      MYSQL_PASSWORD: root
      MYSQL_ROOT_PASSWORD: rootroot
      TZ: Asia/Tokyo
    ports: 
      - "3311:3306"
    volumes: 
      - umarche_laravel:/var/lib/mysql
volumes: 
  umarche_laravel: {}

Mモデル

DBとのやりとりをPHPでかく(エロクアント)
php artisan make:model モデル名

$ php artisan make:model test
   INFO  Model [app/Models/test.php] created successfully.

クラス名とファイル名はおなじになる

migration

DBテーブルの履歴管理
ファイル場所→databases/migrations
モデルは単数形、migrationは複数形で書く。
モデルがTestならtestsと複数形にする
$ php artisan make:migration create_tests_table

$ php artisan make:migration create_tests_table

   INFO  Created migration [2022_10_29_214527_create_tests_table].  

$ php artisan migrate

   INFO  Running migrations.  

  2022_10_29_214527_create_tests_table ............................. 32ms DONE

migrationの当て直し

Laravelでは、1度migration(php artisan migrate)したファイルに新たに書き足したり、消したりしても、そのファイルは2度migrationされません (ロールバックした時のみ再試行される)。

もし、既存のデータベースのテーブルにカラムを追加したいのであれば、追加用のマイグレーションファイルを作る必要がある。

修正したい場合はfresh,refreshコマンドで実行し、 refreshだとロールバックがかかり、すべてのテーブルが削除されて再びmigrateされる。

$ php artisan migrate:refresh

$ php artisan migrate:refresh --seed 
//down()メソッドを実行後up()メソッドを実行

コントローラ内でモデルを取得

php artisan make:controller OwnersController
app/Http/Controllers/ 配下に生成される
→App/Http/Controllers/OwnersController.php

<?php
namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Owner; //Eloquent
use Illuminate\Support\Facades\Hash;

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     * laravelでデータを扱う際にはcollectionを使うことが多い
     * →support,eloquentの2種類あるddを使ってデータの型を見ていく
     */
    //コンストラクタでミドルウェアを設定しadminで認証していた場合実行する
    public function __construct()
    {
        $this->middleware('auth:admin'); 
    }

    public function index()
    {
         //エロクアント
         $owners = Owner::all();
         //クエリビルダ
         $owners = Owner::select('name','email','created_at','id')->paginate(3);
         //compact関数でView側に変数を渡すと楽
         return view('admin.owners.index', compact('owners'));
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //compactで渡す
        $owner = Owner::findOrFail($id);
        return view('admin.owners.edit', compact('owner'));
        
        //$thisで渡す
        $this->viewData['owner'] = Owner::findOrFail($id);
        return view('admin.owners.edit', $this->viewData);
    }       

コントローラからviewへ

<?php
@foreach ($owners as $owner)
<tr>
  <td class="md:px-4 py-3">{{ $owner->name }}</td>
  <td class="md:px-4 py-3">{{ $owner->email }}</td>
  <td class="md:px-4 py-3">{{ $owner->created_at->diffForHumans() }}</td>
  <td class="md:px-4 py-3">
    {{-- <input name="plan" type="radio"> --}}
    <button onclick="location.href='{{ route('admin.owners.edit', ['owner' => $owner->id ])}}'" class="text-white bg-indigo-400 border-0 py-2 px-4 focus:outline-none hover:bg-indigo-500 rounded">更新</button>
  </td>
  <form id="delete_{{$owner->id}}" method="post" action="{{      route('admin.owners.destroy', ['owner' => $owner->id ])}}">
    @csrf
    @method('delete');
   <td class="px-4 py-3">
    <a href='#' data-id="{{ $owner->id }}" onclick="deletePost(this)" class="text-white bg-red-400 border-0 py-2 px-4 focus:outline-none hover:bg-red-500 rounded">削除</a>
   </td>
  </form>
</tr>
@endforeach