1つの文書にまとめるものでもないような短いLaravelネタを気づいた時に追加していきます。バージョンによっては使えないものもあるかもしれません。その時はごめんなさい。

開発サーバのポートを変える

Laravelをインストールした後にphp artisan serveを実行すると8000で起動します。ポートを指定したい場合は、–portオプションを利用します。


 $ php artsan serve --port=80

ポート80だとアクセス権の問題で失敗する時があるのでその時はsudoを使用します。

なぜデフォルトでは8000で8000が使用していると8001に割り当てられますが、これはvendor¥laravel¥framework¥src¥illuminate¥Foundation¥CosoleディレクトリにあるServerCommad.phpに記述されています。


protected function port()
{
    $port = $this->input->getOption('port') ?: 8000;

    return $port + $this->portOffset;
}
LaravelではなくPHPの開発サーバ(ビルトインサーバ)を起動したい場合は、 php -S localhost:8080で起動することができます。起動した場所のディレクトリがルートディレクトリになります。

php artisanのコマンドを忘れたら

php artisan listを実行して、どんなコマンドがあったか確認しましょう。


 $ php artisan list

listの結果出てきたコマンドの詳細を知りたい場合は、php atisan helpコマンドを使用しましょう。


 $ php artisan help コマンド名

コマンドの実行に使われるファイルは下記のディレクトリに保存されています。

vendor¥laravel¥framework¥src¥illuminate¥Foundation¥Console

バージョンが上がったら慣れ親しんだコマンドでもhelpを実行することがおすすめです。より効率的に開発ができる便利なオプションが追加されてたりするので。

php artisan make:modelコマンド

php artisan make:modelコマンドを利用することでModelファイルを作成することができます。Modelファイルとマイグレーションファイルを同時に作成したい場合は-mオプションをつけて実行します。


 % php artisan make:model Post -m

コントローラーやSeederのファイルも一緒に作成したい場合は-aオプションをつけることで作成することができます。


% php artisan make:model Post -a
Model created successfully.
Factory created successfully.
Created Migration: 2021_01_01_001225_create_posts_table
Seeder created successfully.
Controller created successfully.

その他のオプションを知りたい場合はphp artisan help make:modelコマンドで確認してください。

実行したSQLをみたい場合(1)

下記のようにddメソッドをつければデバッグすることができます。


$user = User::where('name','John Doe')->dd();

"select * from `users` where `name` = ?"
array:1 [▼
  0 => "John Doe"
]

実行したSQLをみたい場合(2)

実行したいSQLを見たい場合はAppServiceProvider.phpを利用することもできます。

bootメソッドにDB::listenを下記のように記述することで実行したSQLがログファイルに書き込まれます。ログファイルはstorage/logs/の下に作成されます。


public function boot()
{
    \DB::listen(function ($query) {
        logger()->info($query->sql);
        logger()->info($query->bindings);
        logger()->info($query->time);
    });       
}

Laravelのトップページにアクセスするとログファイルには以下の情報が書き込まれます。


[2019-08-31 01:12:00] local.INFO: select * from `users` where `id` = ? limit 1
[2019-08-31 01:12:00] local.INFO: array (
  0 => 2,
)
[2019-08-31 01:12:00] local.INFO: 14.88

Controllerファイルに記述しても同様にログファイルにSQLを書き出すことができます。

Clockworkというライブラリを利用することもできます。Clockworkを利用する場合はブラウザの拡張機能のインストールも必要になります。

Bladeファイルで改行させたい場合

textareaタグで入力した文章で改行がある場合そのまま{{ $text }}を記述したも改行されません。nl2brは\nなどの改行文字の前に改行タグ<br>を入れてくれます。


{!! nl2br(e($text)) !!}

ユーザのパスワードを強制変更

登録したユーザのパスワードを強制的に変更したい場合は、tinkerを使って行うことができます。

tinkerを起動して、パスワードしたユーザ情報を取得して、Hashファサードを使って12356789のパスワードに変更しています。


$ php artisan tinker
>>> $user = App\User::where('email','john@example.com')->first();
=> App\User {#2963
     id: 2,
     name: "john doe",
     email: "john@example.com",
     email_verified_at: null,
     created_at: "2019-08-31 00:32:35",
     updated_at: "2019-08-31 00:32:35",
   }
>>> $user->password = Hash::make('123456789');
=> "$2y$10$.BCHxBV3rD3pHMdbMa.W.O08JNFWGLwDqehdZKE5kh8PNSADSuSha"
>>> $user->save();
=> true

ログインユーザのIDを取得

ログインしているユーザのIDを取得したい場合はAuthファサードまたはヘルパー関数のauth()を利用することができます。


Auth::user()-id;
Auth::id();
auth()->user()->id;
auth()->id();

JavaScript側で認証ユーザの情報を取得する

JavaScriptやvue.jsなどで認証したユーザ情報を取得したい場合は以下のscriptタグを使うことで取得することができます。


<script>
    window.user = {!! json_encode([ 'user' => auth()->check() ? auth()->user() : null,]) !!}
</script>

userのidだけが必要な場合は、下記とすればユーザのidだけ取得することができます。


<script>
    window.user = {!! json_encode([ 'user' => auth()->check() ? auth()->user()->id : null,]) !!}
</script>

こちらでも取得できます。


<script>
    window.user = {!! auth()->user() !!};
</script>

使用したい場合は、windows.userで可能です。

Bladeファイルのコンパイル後のファイル

LaravelではBladeファイルを使ってHTMLを作成しますがブラウザがBladeファイルを認識できるようにコンパイルを行っています。

そのファイルが/straoge/framework/viewsの下に保存されています。Bladeファイルで使われる@freachなどの構文がどのようなPHPのコードに変換されているかを確認することができます。

Carbonの活用

Bladeファイル内でCarbon(日付)を利用

Bladeファイル内で日付の処理を行いたい場合はCarbonを利用することができます。


{{ \Carbon\Carbon::now() }}

timestamp型で設定してデータをフォーマットして表示させたい場合は以下のように行うことができます。2020-10-20 00:00:00から2020-10-20の表示に変更することができます。


{{ \Carbon\Carbon::createFromTimeString($ship_date)->format('Y-m-d') }}

一定期間の日付を取得(カレンダー)

カレンダーのようにある期間の連続した日付を取得したい場合はCarbonではなくCarbonPeriodが便利です。


$start_date = '2020-01-01';
$end_date = '2020-12-31';
$period = CarbonPeriod::create($start_date,$end_date);
foreach($period as $date){
  echo $date->format('Y-m-d');
}

日付だけではなく曜日だって取得できます。


$week = [ "日", "月", "火", "水", "木", "金", "土"];
foreach($period as $date){
  echo $date->format('Y-m-d');
  echo $date->format('w'); //曜日番号
  echon $week[$date->format('w')] //曜日:日本語
}

作成時からの経過時間を表示

作成時間ではなく作成した時間からどらくらい時間が経過しているのかはdiffForHumansメソッドを使って表示させることができます。


{{ $post->created_at->diffForHumans()}}

Carbon::parse


Carbon::parse('5 seconds');
Carbon::parse('5 minutes');
Carbon::parse('5 months');

コードでログイン

ログイン画面からログインせずコード上でログイン処理を行いたい場合はloginUsingId(id)メソッドが使えます。


auth()->loginUsingId(1); //user id 1でログイン
auth()->logout(); //ログアウト

DBから取得した列名変更とSQLで分岐

データベースから取得した列の名前を変更したい場合はrawメソッドを利用することができます。例えばcalendarsというテーブルはdateという列を持っています。この列名を変更したい場合はrawメソッドを利用することができます。


$dates = DB::table('calendars')->select(DB::raw("date as start_date"))->get();

テーブル名ではなく列の値に定数を設定したい場合にもrawメソッドを利用することはできます。


$dates = DB::table('calendars')->select(DB::raw("date as start_date, '今日は晴れ' as weather "))->get();

テーブルに保存された値によってif文のような分岐処理を行うことができます。その場合はCASE WHEN ELSEを利用できます。holiday列には0か1の値が入っています。


$dates = DB::table('calendars')->select(DB::raw("date as start,(CASE WHEN holiday = 1 THEN '休日' ELSE '休日でない' END) as name"))->get();

年、月、日で検索を行う

例えばdate型で設定して日付に対して2020年の1月のみデータを取得したい場合はどうしていますか。Laravelでは年、月、日を利用して検索を行うメソッドがあります。実際に下記のように検索を行うことができます。date列に入った2020年の1月のデータのみ取得することができます。他にどうのようなメソッドがあるか気になった場合はvendar\laravel\framework\src\illuminate\Database\Query\Builder.phpファイルを除いてみてください。これまで利用していけなかった新しい発見があるかもしません。


$dates = DB::table('calendars')->whereYear('date','2020')->whereMonth('date','01')->get();

時刻が重複しているか確認したい場合のSQL

予約システムを作成した時など予約が重複しないように予約を登録する前にチェックが必要になります。

reservationsというテーブルを作成しstart, end列を持っているとします。開始時間$start, 終了時間$endを使って以下の検索を行うと時刻が重複しているデータを取得することができます。データが取得できない場合はその時間帯に登録されている予約がreserversテーブルに入っていないことになります。


$reservations = Reservation::where('start','<',$end)
                            ->where('end','>',$start)->get();

モデルバインディングに失敗した時は

モデルバインディングに失敗した時はメソッドで指定している変数名がphp artisan route:listで表示されている{変数名}と同じなることを確認してください。

apiルーティングでapiResource/syste_maintenanceと設定した場合。


Route::middleware('auth:sanctum')->apiResource('/system_maintenance', systemMentenanceController::class);

モデルバインディングがうまくいかなかった場合はphp artisan route:listでルーティングのパスを確認してからモデルバインディングの変数を設定してください。$system_maintenanceを短縮系の$sys_mainなどにしないでください。


  public function update(SystemMaintenace $system_maintenance , Request $request){

Conditional Clauses(when)

検索を実施する場合に値があるかどうかをif文でチェックを行い、値がある場合には条件句で検索を絞る場合に下記のように記述することができます。


$query = Report::query();
if(request()->status)  $query()->where('status',request()->status);
$reports = $query->get();

Conditional Clauseesのwhenを利用して下記のように変更することもできます。


$reports = Report::when(request()->status,function($query){
  return $query->where('status',request()->status);
})->get();

whenの後のrequest()->statusに値がある場合はwhere句が実行されます。

tinkerを使いこなそう

userのパスワードを強制的に変更したい場合にphp artisan tinkerが使えることを説明しました。その他にもLaravelのアプリケーションにアクセスしたい場合はapp()を実行することでLaravelの情報を確認することができます。


$ php artisan tinker
Psy Shell v0.10.6 (PHP 7.4.13 ― cli) by Justin Hileman
>>> app()
=> Illuminate\Foundation\Application {#2
     configurationIsCached: false,
     environment: "local",
     environmentFile: ".env",
     isLocal: true,
     routesAreCached: false,
     runningUnitTests: false,
     version: "8.29.0",
     path: "/home/reffect/laravel/app",
     basePath: "/home/red0410/redhearts.co.jp/groupware",
     configPath: "/home/reffect/laravel/config",
     databasePath: "/home/reffect/laravel/database",
     langPath: "/home/reffect/laravel/resources/lang",
     publicPath: "/home/reffect/laravel/public",
     storagePath: "/home/reffect/laravel/storage",
     bootstrapPath: "/home/reffect/laravel/bootstrap",
   }

テーブルに保存されているデータにアクセスすることも可能です。


>>> App\Models\User::all();
=> Illuminate\Database\Eloquent\Collection {#4414
     all: [
       App\Models\User {#337
         id: 1,
         name: "john doe",
         email: "john@example.com",
         email_verified_at: null,
         created_at: "2021-03-13 16:13:47",
         updated_at: "2021-03-13 16:14:08",
       },

JSONデータのnumberがstringになった場合

Laravelから戻されるJSONデータの数値が文字列になっている場合は以下のようにJSON_NUMERIC_CHECKをつけることで文字列ではなく数値としてデータを戻すことができます。


return response()->json($users,200, [], JSON_NUMERIC_CHECK);

Laravelの過去のバージョンをインストールしたい場合

Laravelのバージョン7の最新をインストールしたい場合は下記のcomposerコマンドを利用してインストールすることができます。


% composer create-project --prefer-dist laravel/laravel blog "7.*"
% cd blog
% php artisan -V     
Laravel Framework 7.30.4

5.8のようにバージョンを細かく指定した場合は下記のように行うことができます。


% composer create-project --prefer-dist laravel/laravel blog "5.8"
% cd blog
% php artisan -V
Laravel Framework 5.8.38

Laravelマイナーバージョンアップデート

Laravelのマイナーバージョンのアップデートはcomposer updateを実行することでアップデートが可能です。

ヘルパー関数

assets関数の場所

assetsヘルパー関数の場所はLaravelのインストールディレクトリのpublicの下に対応します。もしassets(‘img/logo.png’)としたらインストールディレクトリ/public/img/logo.pngのファイルにアクセスが行われます。

その他のヘルパー関数

そのほかにもLaravelではdd関数、redirect関数、request関数など使用頻度の高い便利なヘルパー関数が多数登録されています。Laravelを使いはじめの頃はヘルパー関数の何が便利なのかはわからないと思います。Laravelに慣れた後にヘルパー関数のページを眺めるだけで新たな発見(こんな便利な関数があるのか)が出てくるので定期的に読み返す癖をつけるようにしてください。

ルーティング

web.phpファイルにルーティングを追加する際に直接viewファイルを戻したい場合は以下のように記述することができます。ブラウザから/companyにアクセスするとcompany.blade.phpファイルの内容が表示されます。


Route::view('/company','compnay');

マイグレーション

外部キー設定

以前はforeign keyを設定する場合に下記のように記述を行なっていましたがよりシンプルに記述する方法が追加されています。


Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users');
});

記述が1行で済むので非常に便利です。Laravel7から追加された機能なのでまだ利用したことがない人が入れば活用してください。


Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

status

現在マイグレーションが実行されたマイグレーションファイルの状況を調べたい時に実行する。


$ php artisan migrate:status
+------+-----------------------------------------------------------+-------+
| Ran? | Migration                                                 | Batch |
+------+-----------------------------------------------------------+-------+
| Yes  | 2014_10_12_000000_create_users_table                      | 1
//略

列の追加/削除

新たに列の追加が必要になった場合もmigrationファイルを利用して列の追加を行うことができます。

–tableのオプションの後ろには列を追加したいテーブルを指定します。make:migrationの後には追加を行うテーブルと列が分かるように下記のように記述します。


% php artisan make:migration add_is_admin_to_users_table --table=users

実行すると2019_09_03_233539_add_is_admin_to_users_table.phpという名前のマイグレーションファイルが作成されます。作成したファイルにbooleanでis_adminを追加します。rollbackを行う場合もあるのでdownメソッドでdropColumnを設定しています。テーブルから列を削除したい場合はdropColumnを利用することができます。afterメソッドでemail列の後ろにis_admin列を追加する設定を行います。もし何も設定しない場合は最後の列に追加されます。


public function up()
{
    Schema::table('reports', function (Blueprint $table) {
        $table->boolean('is_admin')->default(false)->after('email');
    });
}

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

列情報の削除にはdoctrine/dbalのパッケージが必要となるので、インストールを行っておいてください。


% composer require doctrine/dbal

Pagination

ページネーションで1ページに表示される数をpaginateメソッドの中に指定することもできまるがモデルファイルの$pagenate変数を設定することでも実現できます。


protected $perPage = 15;

コレクション

一部の属性のみ取り出したい場合

Userモデルの中からidとname属性のみ戻したい場合は以下のようにmapとonlyを利用して行うことができます。


$users = User::all();
$users = $users->map->only(['id','name']);

Userモデルのname属性のみ戻したい場合は

JSONでエラーを戻す

APIでエラーが発生した場合にバリデーションと同様のエラーの形で戻したい場合は下記のように記述することで対応することができます。


return response()->json([
      'errors' => ["message" => ['This is error message']]
    ], 422);

随時追加