20201017のlaravelに関する記事は12件です。

Laravel(7.20.0)でゲストログイン機能を実装

はじめに

ポートフォリオ作成していくうえで、開発して終わりではもったいないと思います。
どうせなら作ったものを、ほかの人に触ってもらってフィードバックを受け、それをもとに改善していくことでより良いものを作ることが出来、かつ勉強にもなります。

とはいっても、自分も最初はなかなか作ったものを他人に見せる勇気がありませんでした。
最近では、友人や面接時に様々なフィードバックをいただき、日々改善しています。

そんな中、ログイン機能を実装しているアプリケーションの場合、アカウントを作成しログインする必要があります。
友達であればまだいいかもしれませんが、関係の浅い人(面接官など)の場合アカウントを作成しログインしてアプリケーションを触ることは手間がかかり触ってもらえる機会を失ってしまうかもしれません。
それはもったいない!!!

そこで今回は、ゲストログイン機能を実装したので軽くご紹介します!

前提

  • すでにアプリケーションがあり、ログイン機能を実装している

流れ

とはいっても、そんなに難しいことをするわけでもありません。

やることとしては、
- ゲストログイン処理の実装
- 登録画面とログイン画面に、ゲストログインボタンを実装
- web.phpにてルーティングの実装

ゲストログイン処理の実装

まず、Laravelの公式ドキュメントを見てみると

Laravelの認証サービスにはAuthファザードでアクセスできます。クラスの最初でAuthファサードを確実にインポートしておきましょう。次にattemptメソッドを見てみましょう。
認証7.x 自前のユーザー認証

とのことで、認証するにあたってAuthファザードのattemptメソッドを使えばよさそう。
今回はapp\Controllers\Auth\LoginController.phpにゲストログイン処理を実装する。

LoginController.php
public function guestLogin()
{
    $email = 'hoge@hoge.jp';
    $password = 'hogehoge';

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
        return redirect()->route('home');
    }

    return redirect('/');
}

attemptメソッドは、最初の引数として、キー/値ペアの配列を受け取ります。
今回は、メールアドレスとパスワードの配列を引数に指定します。こちらで指定している値(emailとpassword)を持つユーザーアカウントをデータベース内にあるか探す。
→当然ながら、あらかじめゲスト用アカウントデータを作成しておくこと!

認証が成功すれば、trueを返し失敗したらfalseを返す。

注意点としては、

データベース中のハッシュ済みパスワードと比較する前に、フレームワークは自動的に値をハッシュ化するため、passwordへ指定する値はハッシュ化しないでください。

とのこと。より詳しく確認したい場合は、公式ドキュメントをご確認ください。

これでゲストログイン処理の実装が完了。

ゲストログインボタンを実装

ゲストログイン処理を実装しても、肝心のゲストログインボタンを忘れたらできません。
そこで登録画面とログイン画面に、ゲストログインボタンを実装していきます!

login.blade.php
<button type="submit" class="btn btn-secondary guest-btn">
  <a href="/login/guest">Guest Login</a>
</button>

こんな感じで、register.blade.phpも同様に上記のコードを実装します。

これで終わりかと思いきや、まだ肝心のルーティングを用意していないためそちらを記載します。

ルーティングの実装

web.phpにてルーティングを実装する。

web.php
Route::get('/login/guest', 'Auth\LoginController@guestLogin');

これで完成。

まとめ

今回は、Laravelにてゲストログイン機能を実装しました。
後回しにしていましたが、やってみるととても簡単でした。ちょっとした機能ではありますが、今回のようにユーザー目線で開発が行えるといいですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel7.20.0でゲストログイン機能を実装

はじめに

ポートフォリオ作成していくうえで、開発して終わりではもったいないと思います。
どうせなら作ったものを、ほかの人に触ってもらってフィードバックを受け、それをもとに改善していくことでより良いものを作ることが出来、かつ勉強にもなります。

とはいっても、自分も最初はなかなか作ったものを他人に見せる勇気がありませんでした。
最近では、友人や面接時に様々なフィードバックをいただき、日々改善しています。

そんな中、ログイン機能を実装しているアプリケーションの場合、アカウントを作成しログインする必要があります。
友達であればまだいいかもしれませんが、関係の浅い人(面接官など)の場合アカウントを作成しログインしてアプリケーションを触ることは手間がかかり触ってもらえる機会を失ってしまうかもしれません。
それはもったいない!!!

そこで今回は、ゲストログイン機能を実装したので軽くご紹介します!

前提

  • すでにアプリケーションがあり、ログイン機能を実装している

流れ

とはいっても、そんなに難しいことをするわけでもありません。

やることとしては、
- ゲストログイン処理の実装
- 登録画面とログイン画面に、ゲストログインボタンを実装
- web.phpにてルーティングの実装

ゲストログイン処理の実装

まず、Laravelの公式ドキュメントを見てみると

Laravelの認証サービスにはAuthファザードでアクセスできます。クラスの最初でAuthファサードを確実にインポートしておきましょう。次にattemptメソッドを見てみましょう。
認証7.x 自前のユーザー認証

とのことで、認証するにあたってAuthファザードのattemptメソッドを使えばよさそう。
今回はapp\Controllers\Auth\LoginController.phpにゲストログイン処理を実装する。

LoginController.php
public function guestLogin()
{
    $email = 'hoge@hoge.jp';
    $password = 'hogehoge';

    if (Auth::attempt(['email' => $email, 'password' => $password])) {
        return redirect()->route('home');
    }

    return redirect('/');
}

attemptメソッドは、最初の引数として、キー/値ペアの配列を受け取ります。
今回は、メールアドレスとパスワードの配列を引数に指定します。こちらで指定している値(emailとpassword)を持つユーザーアカウントをデータベース内にあるか探す。
→当然ながら、あらかじめゲスト用アカウントデータを作成しておくこと!

認証が成功すれば、trueを返し失敗したらfalseを返す。

注意点としては、

データベース中のハッシュ済みパスワードと比較する前に、フレームワークは自動的に値をハッシュ化するため、passwordへ指定する値はハッシュ化しないでください。

とのこと。より詳しく確認したい場合は、公式ドキュメントをご確認ください。

これでゲストログイン処理の実装が完了。

ゲストログインボタンを実装

ゲストログイン処理を実装しても、肝心のゲストログインボタンを忘れたらできません。
そこで登録画面とログイン画面に、ゲストログインボタンを実装していきます!

login.blade.php
<button type="submit" class="btn btn-secondary guest-btn">
  <a href="/login/guest">Guest Login</a>
</button>

こんな感じで、register.blade.phpも同様に上記のコードを実装します。

これで終わりかと思いきや、まだ肝心のルーティングを用意していないためそちらを記載します。

ルーティングの実装

web.phpにてルーティングを実装する。

web.php
Route::get('/login/guest', 'Auth\LoginController@guestLogin');

これで完成。

まとめ

今回は、Laravelにてゲストログイン機能を実装しました。
後回しにしていましたが、やってみるととても簡単でした。ちょっとした機能ではありますが、今回のようにユーザー目線で開発が行えるといいですね!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】初めてのマイグレーション

Laravelでのモデル作成とマイグレーションファイル編集に関する備忘録。

■ モデル作成

モデル作成(※モデル名は、大文字から始まる単数形)
% php artisan make:model モデル名             // app直下にファイル生成
% php artisan make:model Entities/モデル名    // app/Entities下にファイル生成される
% php artisan make:model モデル名 -m -c -r    // モデル、マイグレーション、コントローラーを一気に生成

% php artisan make:model -h                 // どんなオプションがあるか?
  • マイグレーションクラスは、2つのメソッドがある(up、down)。
    • upメソッド : マイグレーション実行時の処理 を記述。
    • downメソッド : ロールバック時の処理を記述(upメソッドの逆)。
作成されるマイグレーションファイルのざっくりイメージ(database/migrations/2020_10_15_012345_create_xxxxx_table.php)
public function up()           // マイグレーション実行時の処理は、up() に記述
  {
    Schema::create('xxxxxs', function (Blueprint $table) {
      $table->increments('id');        // デフォルト
      $table->データ型('カラム名');        // カラム作成
      $table->tinyInteger('gender')->unsigned()->comment('性別 1:男、2:女');
      $table->timestamps();            // デフォルト
    });
  }
public function down()        // ロールバック時の処理は、down() に記述
  {
    Schema::dropIfExists('xxxxxs');    // テーブル削除
    Schema::create('xxxxxs', function (Blueprint $table) {
      $table->dropColumn('カラム名');    // カラム削除
      $table->dropColumn('gender');
    });
  }

よく使うマイグレーション関連のコマンド

マイグレーションに関するコマンド
% php artisan migrate:status              // 状態確認
% php artisan migrate                     // マイグレーション実行
% composer dump-autoload                  // 「クラスが見つかりません」エラーが発生したら、migrateコマンドを再発行してみる
% php artisan migrate:refresh             // 初期化→再実行(マイグレーションファイル追加でエラーが出た時など)
% php artisan migrate:fresh               // 全テーブル削除 →マイグレーション実行
% php artisan migrate:rollback            // ロールバック(1つ前)
% php artisan migrate:rollback --step=2   // ロールバック(戻る位置指定)
% php artisan migrate:reset               // 全マイグレーションをリセット(初期化)

■ マイグレーションファイルのみ作成したいなら

例)マイグレーションファイルのみ作成したい場合
% php artisan make:migration create_boxs_table --create=boxs             // boxsテーブル生成
% php artisan make:migration add_カラム名_to_users_table --table=users     // usersテーブルにカラム追加(既存テーブルを更新)
% php artisan make:migration rename_旧テーブル名_to_新テーブル名_table        // テーブル名変更

// マイグレーションファイルの編集ができたら、実行
% php artisan migrate
% composer require doctrine/dbal     // 注)変更・追加には、変更追加用のパッケージのインストールが必要

■ マイグレーションファイルの書き方

テーブル関連

テーブル
// テーブル名変更
Schema::rename("旧テーブル名", "新テーブル名");

// テーブル削除
Schema::drop('users');
Schema::dropIfExists('users');     // テーブルがあれば削除して、なければ何もしない(エラー回避)

カラム関連

カラム追加・削除

カラム追加・削除
// カラム追加
$table->カラム型('カラム名');
$table->string('カラム名');

// カラム削除
$table->dropColumn('削除したいカラム名');
$table->dropColumn(['削除したいカラム名1', '削除したいカラム名2',..]);   // 複数のカラムを削除したい場合は、配列で渡す
  • カラム削除のコマンド
削除コマンド 説明
$table->dropRememberToken( ); remember_tokenカラム(Eloquent認証ドライバーを扱うためのカラム )
$table->dropSoftDeletes( ); deleted_atカラム(ソフトデリート用のNULL可能なカラム)
$table->dropSoftDeletesTz( ); ↑ と同義
$table->dropTimestamps( ); created_atとupdated_atカラム
$table->dropTimestampsTz( ); ↑ と同義
  • ソフトデリートとは?
    • 論理削除のこと。データは削除せず、データを削除したものをして取り扱う。

カラム変更

  • カラム変更前に、composer.jsonファイルでdoctrine/dbalの追加が必要。
    • 現在の状態を決め、指定カラムの修正を行うSQLクエリ生成に使われる。
composer require doctrine/dbal
カラム変更
// カラム名変更
$table -> renameColumn('以前のカラム名', '新しいカラム名');

// カラム属性の変更
$table->string('name', 50) -> change();                 // nameカラムのサイズ変更
$table->string('name', 50) -> nullable() -> change();   // NULLを許可する場合
  • chengeメソッド : カラム型、属性の変更。

インデックスや制約など

インデックス

  • Laravelでは、デフォルトで意味が通る名前をインデックスに付ける。
    • インデックス名 : テーブル名_インデックスしたカラム名_インデックスタイプ

インデックス 【追加】

インデックス追加コマンド 概要 使用例
index('カラム名') インデックス追加 $table->integer('category_id')->index('category_id');
unique('カラム名') ユニークキー追加 $table->unique('email');、$table->string('email')->unique();
primary('id'); 主キー追加 $table->primary('id');
primary(['id', 'parent_id']); 複合キー追加 $table->primary(['id', 'parent_id']);
spatialIndex('カラム名'); 空間インデックス追加(SQLite以外) $table->spatialIndex('location');

インデックス 【削除】

  • インデックス削除は、インデックス名を指定する。
インデックス削除コマンド 概要
$table->dropIndex('テーブル名_カラム名 _index'); インデックス削除
$table->dropUnique('テーブル名_カラム名 _unique'); ユニークキー削除
$table->dropPrimary('テーブル名_id _primary'); 主キー削除
$table->dropSpatialIndex('テーブル名_カラム名 _spatialindex'); 空間インデックス削除(SQLite以外)
  • カラムの配列をインデックスの削除メソッドに渡すと、インデックス名が自動生成される。
例)インデックス削除
$table -> dropIndex(['content']);   // 例) boxs_content_index

外部キー

外部キー 【追加】

  • 紐づけたいテーブルのid(unsined(符号無し))と同様の制約をつけないと形式不一致でエラーになるので注意。
既存カラムを外部キーにする(紐づける)場合
例)既存のuser_idカラムを外部キーにする
$table->integer('user_id')->unsigned()->change();                  // 符号無し属性に変更
$table->foreign('user_id')->references('id')->on('users');         // 外部キー参照
新規カラムとして、外部キーを作成する場合
例)usersテーブルのidカラムを使って、postsテーブルにuser_idカラムを定義する
Schema::table('posts', function (Blueprint $table) {
  $table->integer('user_id')->unsigned();                           // 符号無し属性を作成
  $table->foreign('user_id')->references('id')->on('users');        // 外部キー参照
});

外部キー 【削除】

  • dropForeignメソッド : 他のインデックスと似た命名規則。
  • テーブル名_カラム名_foreign
外部キーの削除
$table->dropForeign('posts_user_id_foreign');
$table->dropForeign(['user_id']);              // 配列で渡せば、命名規則に従った名前が使用される
  • 参)マイグレーション中の外部キー制約を一時的に、有効/無効化ができるメソッドも用意されてる。
    • 外部キー制約を無効にしてDBを操作し、終わったら有効に戻すような時に使う。
参)外部キー制約の有効/無効化の変更
Schema::enableForeignKeyConstraints();    //外部キー制約を有効化
Schema::disableForeignKeyConstraints();   //外部キー制約を一時的に無効化

マイグレーション関連のエラー

MySQL接続エラー: SQLSTATE[HY000][2002]No such file or directory

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

  • DBに接続できていないエラー。
  • (原因例)
    • .envファイルとMySQL(DB)の、DB_DATABASE、DB_USERNAME、DB_PASSWORDが異なる。
    • .envファイルの修正後、キャッシュをクリアできてない。
    • rootユーザーのPW変更後に、MySQLを再起動してない。
    • MySQLソケットに関するファイル(mysql.sock)が読み込まれてない。 → database.phpで unix_socket を設定する。
ターミナルからunix_socketを確認
// MySQL
% show variables like '%sock%';
            :
 | socket | /Applications/MAMP/tmp/mysql/mysql.sock |
unix_socketの設定(database.php)
'mysql' => [
  'driver'      => 'mysql',
  'host'        => 'localhost',
          : 
  'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock', 
],

■ カラム型 一覧

コマンド 概要
increments('id'); 符号なしの数値(INT)を使ったID(主キー)。0〜4294967295。
bigIncrements('id'); 符号なしのBIGINTを使ったID(主キー)。0〜18446744073709551615。※ 21億行以上にならないなら、↑ を使う。
tinyInteger('numbers'); 数値(TINYINT型)。1バイト
smallInteger('カラム名'); 数値(SMALLINT型)。2バイト
mediumInteger('カラム名'); 数値(MEDIUMINT型)。3バイト
integer('カラム名'); 数値(INT型)。4バイト
bigInteger('カラム名'); 数値(BIGINT型)。8バイト
float('カラム名', ○, △); トータルで8桁、小数点以下2桁以内の小数
double('カラム名', ○, △); トータルで15桁、小数点以下8桁以内の小数
decimal('カラム名', ○, △); トータルで5桁、小数点以下2桁以内の小数
char('カラム名', 5); 固定長文字列(長さが決まってる文字列)
string('カラム名'); 可変長文字列。デフォルトの最大文字数:255文字
string('カラム名', 100); 最大文字数指定の可変長文字列
text('カラム名'); 文字列。65,535文字(約64Kバイト)
mediumText('カラム名'); 長い文字列。16,777,215文字(約16Mバイト)
longText('カラム名'); めっちゃ長い文字列。4,294,967,295文字(約4Gバイト)
date('カラム名'); 日付
time('カラム名'); 時間
timeTz('カラム名'); 時間(タイムゾーン付き)
dateTime('カラム名'); 日時
dateTimeTz('カラム名'); 日時(タイムゾーン付き)
boolean('カラム名')->default(false); 真偽値
enum('カラム名', ['定数', '定数']); enum型
binary('カラム名'); バイナリデータ
json('カラム名'); JSON
jsonb('カラム名'); JSONB
timestamp('カラム名'); タイムスタンプ
timestampTz('カラム名'); タイムスタンプ(タイムゾーン付き)
timestamps(); created_atとupdated_at
nullableTimestamps(); ↑と同じ(NULLを許可)
softDeletes(); NULL可能な deleted_at カラム。例:退会日時などの管理用途(nullでなければ、退会済)
ipAddress('カラム名'); IPアドレス
macAddress('カラム名'); MACアドレス
rememberToken(); Eloquent認証ドライバーを扱うためのカラム。remember_tokenVARCHAR(100)NULLとして追加
uuid('id'); UUID。重複の可能性が小さく、一意な識別子として扱えるID
morphs('カラム名'); 符号なし数値(taggable_id)と文字列(taggable_type)を追加

■ オプション(カラム修飾子)一覧

カラム修飾子 概要
->comment('コメント内容') コメント追加(MySQLのみ)
->nullable() NULL許可
->unsigned() 整数カラムを符号なしに設定(MySQLのみ)。外部キーでよく使う
->default('値')、->default($value) デフォルト値を設定
->first() テーブルの最初(first)に設置(MySQLのみ)
->after('カラム名') 指定カラムの次にカラム追加(MySQLのみ)
->autoIncrement() 整数カラムをID(主キー)に設定
->charset('utf8') キャラクタセットを指定(MySQLのみ)
->collation('utf8_unicode_ci') コロケーションを指定(MySQL/SQL Serverのみ)
->nullable($value = true)、->nullable()->default(null) デフォルトでNULL値を指定
->storedAs($expression) stored generatedカラムを生成(MySQLのみ)
->useCurrent() TIMESTAMPカラムのデフォルト値をCURRENT_TIMESTAMPに指定
->virtualAs($expression) virtual generatedカラムを生成(MySQLのみ)

■ データの作成

  • テーブルが作成できたら、データを作成してみる。

seederで初期値を作成する場合

例)UsersTableSeeder.php生成
% php artisan make:seeder UsersTableSeeder        // UsersTableSeeder.phpが生成される
database/seeds/UsersTableSeeder.php
public function run(){
  DB::table('users')->insert([
    'name' => 'ユーザー1',
    'email' => 'ユーザー1@gmail.com',
    'password' => bcrypt('ユーザー1') 
  ]);
}
database/seeds/DatabaseSeeder.php
public function run()
{
  // $this->call(UsersTableSeeder::class);   // コメントアウトする
}
seederから、データを作成する
% php artisan db:seed --class=UsersTableSeeder     // データ作成
% php artisan tinker                               // 作成したデータの確認
  >>> use App\User
  >>> User::all()

コンソール操作でレコードを作成する場合

ターミナル操作で作成する方法
% php artisan tinker               // コンソール起動
  // レコード作成( インスタンスを作成して、saveメソッドを使う )
  >>> $box = new App\Box();        // インスタンス作成(※ 名前空間がデフォルトでAppなので、App\モデル名(); )
  >>> $box -> title = 'タイトル1';
  >>> $box -> content = '詳細1';
  >>> $box -> save();              // 保存
  => true                         // レコード作成成功

  >>> App\Box::all();             // 作成したデータの確認
  >>> App\Box::all()->ToArray();  // 作成したデータの確認(配列で取得)
  >>> exit
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】初めてのマイグレーション

Laravelでのモデル作成とマイグレーションファイル編集に関する備忘録。

■ モデル作成

モデル作成(※モデル名は、大文字から始まる単数形)
% php artisan make:model モデル名             // app直下にファイル生成
% php artisan make:model Entities/モデル名    // app/Entities下にファイル生成される
% php artisan make:model モデル名 -m -c -r    // モデル、マイグレーション、コントローラーを一気に生成

% php artisan make:model -h                 // どんなオプションがあるか?
  • マイグレーションクラスは、2つのメソッドがある(up、down)。
    • upメソッド : マイグレーション実行時の処理 を記述。
    • downメソッド : ロールバック時の処理を記述(upメソッドの逆)。
作成されるマイグレーションファイルのざっくりイメージ(database/migrations/2020_10_15_012345_create_xxxxx_table.php)
public function up()           // マイグレーション実行時の処理は、up() に記述
  {
    Schema::create('xxxxxs', function (Blueprint $table) {
      $table->increments('id');        // デフォルト
      $table->データ型('カラム名');        // カラム作成
      $table->tinyInteger('gender')->unsigned()->comment('性別 1:男、2:女');
      $table->timestamps();            // デフォルト
    });
  }
public function down()        // ロールバック時の処理は、down() に記述
  {
    Schema::dropIfExists('xxxxxs');    // テーブル削除
    Schema::create('xxxxxs', function (Blueprint $table) {
      $table->dropColumn('カラム名');    // カラム削除
      $table->dropColumn('gender');
    });
  }

よく使うマイグレーション関連のコマンド

マイグレーションに関するコマンド
% php artisan migrate:status              // 状態確認
% php artisan migrate                     // マイグレーション実行
% composer dump-autoload                  // 「クラスが見つかりません」エラーが発生したら、migrateコマンドを再発行してみる
% php artisan migrate:refresh             // 初期化→再実行(マイグレーションファイル追加でエラーが出た時など)
% php artisan migrate:fresh               // 全テーブル削除 →マイグレーション実行
% php artisan migrate:rollback            // ロールバック(1つ前)
% php artisan migrate:rollback --step=2   // ロールバック(戻る位置指定)
% php artisan migrate:reset               // 全マイグレーションをリセット(初期化)

■ マイグレーションファイルのみ作成したいなら

例)マイグレーションファイルのみ作成したい場合
% php artisan make:migration create_boxs_table --create=boxs             // boxsテーブル生成
% php artisan make:migration add_カラム名_to_users_table --table=users     // usersテーブルにカラム追加(既存テーブルを更新)
% php artisan make:migration rename_旧テーブル名_to_新テーブル名_table        // テーブル名変更

// マイグレーションファイルの編集ができたら、実行
% php artisan migrate
% composer require doctrine/dbal     // 注)変更・追加には、変更追加用のパッケージのインストールが必要

■ マイグレーションファイルの書き方

テーブル関連

テーブル
// テーブル名変更
Schema::rename("旧テーブル名", "新テーブル名");

// テーブル削除
Schema::drop('users');
Schema::dropIfExists('users');     // テーブルがあれば削除して、なければ何もしない(エラー回避)

カラム関連

カラム追加・削除

カラム追加・削除
// カラム追加
$table->カラム型('カラム名');
$table->string('カラム名');

// カラム削除
$table->dropColumn('削除したいカラム名');
$table->dropColumn(['削除したいカラム名1', '削除したいカラム名2',..]);   // 複数のカラムを削除したい場合は、配列で渡す
  • カラム削除のコマンド
削除コマンド 説明
$table->dropRememberToken( ); remember_tokenカラム(Eloquent認証ドライバーを扱うためのカラム )
$table->dropSoftDeletes( ); deleted_atカラム(ソフトデリート用のNULL可能なカラム)
$table->dropSoftDeletesTz( ); ↑ と同義
$table->dropTimestamps( ); created_atとupdated_atカラム
$table->dropTimestampsTz( ); ↑ と同義
  • ソフトデリートとは?
    • 論理削除のこと。データは削除せず、データを削除したものをして取り扱う。

カラム変更

  • カラム変更前に、composer.jsonファイルでdoctrine/dbalの追加が必要。
    • 現在の状態を決め、指定カラムの修正を行うSQLクエリ生成に使われる。
composer require doctrine/dbal
カラム変更
// カラム名変更
$table -> renameColumn('以前のカラム名', '新しいカラム名');

// カラム属性の変更
$table->string('name', 50) -> change();                 // nameカラムのサイズ変更
$table->string('name', 50) -> nullable() -> change();   // NULLを許可する場合
  • chengeメソッド : カラム型、属性の変更。

インデックスや制約など

インデックス

  • Laravelでは、デフォルトで意味が通る名前をインデックスに付ける。
    • インデックス名 : テーブル名_インデックスしたカラム名_インデックスタイプ

インデックス 【追加】

インデックス追加コマンド 概要 使用例
index('カラム名') インデックス追加 $table->integer('category_id')->index('category_id');
unique('カラム名') ユニークキー追加 $table->unique('email');、$table->string('email')->unique();
primary('id'); 主キー追加 $table->primary('id');
primary(['id', 'parent_id']); 複合キー追加 $table->primary(['id', 'parent_id']);
spatialIndex('カラム名'); 空間インデックス追加(SQLite以外) $table->spatialIndex('location');

インデックス 【削除】

  • インデックス削除は、インデックス名を指定する。
インデックス削除コマンド 概要
$table->dropIndex('テーブル名_カラム名 _index'); インデックス削除
$table->dropUnique('テーブル名_カラム名 _unique'); ユニークキー削除
$table->dropPrimary('テーブル名_id _primary'); 主キー削除
$table->dropSpatialIndex('テーブル名_カラム名 _spatialindex'); 空間インデックス削除(SQLite以外)
  • カラムの配列をインデックスの削除メソッドに渡すと、インデックス名が自動生成される。
例)インデックス削除
$table -> dropIndex(['content']);   // 例) boxs_content_index

外部キー

外部キー 【追加】

  • 紐づけたいテーブルのid(unsined(符号無し))と同様の制約をつけないと形式不一致でエラーになるので注意。
既存カラムを外部キーにする(紐づける)場合
例)既存のuser_idカラムを外部キーにする
$table->integer('user_id')->unsigned()->change();                  // 符号無し属性に変更
$table->foreign('user_id')->references('id')->on('users');         // 外部キー参照
新規カラムとして、外部キーを作成する場合
例)usersテーブルのidカラムを使って、postsテーブルにuser_idカラムを定義する
Schema::table('posts', function (Blueprint $table) {
  $table->integer('user_id')->unsigned();                           // 符号無し属性を作成
  $table->foreign('user_id')->references('id')->on('users');        // 外部キー参照
});

外部キー 【削除】

  • dropForeignメソッド : 他のインデックスと似た命名規則。
  • テーブル名_カラム名_foreign
外部キーの削除
$table->dropForeign('posts_user_id_foreign');
$table->dropForeign(['user_id']);              // 配列で渡せば、命名規則に従った名前が使用される
  • 参)マイグレーション中の外部キー制約を一時的に、有効/無効化ができるメソッドも用意されてる。
    • 外部キー制約を無効にしてDBを操作し、終わったら有効に戻すような時に使う。
参)外部キー制約の有効/無効化の変更
Schema::enableForeignKeyConstraints();    //外部キー制約を有効化
Schema::disableForeignKeyConstraints();   //外部キー制約を一時的に無効化

マイグレーション関連のエラー

MySQL接続エラー: SQLSTATE[HY000][2002]No such file or directory

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

  • DBに接続できていないエラー。
  • (原因例)
    • .envファイルとMySQL(DB)の、DB_DATABASE、DB_USERNAME、DB_PASSWORDが異なる。
    • .envファイルの修正後、キャッシュをクリアできてない。
    • rootユーザーのPW変更後に、MySQLを再起動してない。
    • MySQLソケットに関するファイル(mysql.sock)が読み込まれてない。 → database.phpで unix_socket を設定する。
ターミナルからunix_socketを確認
// MySQL
% show variables like '%sock%';
            :
 | socket | /Applications/MAMP/tmp/mysql/mysql.sock |
unix_socketの設定(database.php)
'mysql' => [
  'driver'      => 'mysql',
  'host'        => 'localhost',
          : 
  'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock', 
],

■ カラム型 一覧

コマンド 概要
increments('id'); 符号なしの数値(INT)を使ったID(主キー)。0〜4294967295。
bigIncrements('id'); 符号なしのBIGINTを使ったID(主キー)。0〜18446744073709551615。※ 21億行以上にならないなら、↑ を使う。
tinyInteger('numbers'); 数値(TINYINT型)。1バイト
smallInteger('カラム名'); 数値(SMALLINT型)。2バイト
mediumInteger('カラム名'); 数値(MEDIUMINT型)。3バイト
integer('カラム名'); 数値(INT型)。4バイト
bigInteger('カラム名'); 数値(BIGINT型)。8バイト
float('カラム名', ○, △); トータルで8桁、小数点以下2桁以内の小数
double('カラム名', ○, △); トータルで15桁、小数点以下8桁以内の小数
decimal('カラム名', ○, △); トータルで5桁、小数点以下2桁以内の小数
char('カラム名', 5); 固定長文字列(長さが決まってる文字列)
string('カラム名'); 可変長文字列。デフォルトの最大文字数:255文字
string('カラム名', 100); 最大文字数指定の可変長文字列
text('カラム名'); 文字列。65,535文字(約64Kバイト)
mediumText('カラム名'); 長い文字列。16,777,215文字(約16Mバイト)
longText('カラム名'); めっちゃ長い文字列。4,294,967,295文字(約4Gバイト)
date('カラム名'); 日付
time('カラム名'); 時間
timeTz('カラム名'); 時間(タイムゾーン付き)
dateTime('カラム名'); 日時
dateTimeTz('カラム名'); 日時(タイムゾーン付き)
boolean('カラム名')->default(false); 真偽値
enum('カラム名', ['定数', '定数']); enum型
binary('カラム名'); バイナリデータ
json('カラム名'); JSON
jsonb('カラム名'); JSONB
timestamp('カラム名'); タイムスタンプ
timestampTz('カラム名'); タイムスタンプ(タイムゾーン付き)
timestamps(); created_atとupdated_at
nullableTimestamps(); ↑と同じ(NULLを許可)
softDeletes(); NULL可能な deleted_at カラム。例:退会日時などの管理用途(nullでなければ、退会済)
ipAddress('カラム名'); IPアドレス
macAddress('カラム名'); MACアドレス
rememberToken(); Eloquent認証ドライバーを扱うためのカラム。remember_tokenVARCHAR(100)NULLとして追加
uuid('id'); UUID。重複の可能性が小さく、一意な識別子として扱えるID
morphs('カラム名'); 符号なし数値(taggable_id)と文字列(taggable_type)を追加

■ オプション(カラム修飾子)一覧

カラム修飾子 概要
->comment('コメント内容') コメント追加(MySQLのみ)
->nullable() NULL許可
->unsigned() 整数カラムを符号なしに設定(MySQLのみ)。外部キーでよく使う
->default('値')、->default($value) デフォルト値を設定
->first() テーブルの最初(first)に設置(MySQLのみ)
->after('カラム名') 指定カラムの次にカラム追加(MySQLのみ)
->autoIncrement() 整数カラムをID(主キー)に設定
->charset('utf8') キャラクタセットを指定(MySQLのみ)
->collation('utf8_unicode_ci') コロケーションを指定(MySQL/SQL Serverのみ)
->nullable($value = true)、->nullable()->default(null) デフォルトでNULL値を指定
->storedAs($expression) stored generatedカラムを生成(MySQLのみ)
->useCurrent() TIMESTAMPカラムのデフォルト値をCURRENT_TIMESTAMPに指定
->virtualAs($expression) virtual generatedカラムを生成(MySQLのみ)

■ データの作成

  • テーブルが作成できたら、データを作成してみる。

seederで初期値を作成する場合

例)UsersTableSeeder.php生成
% php artisan make:seeder UsersTableSeeder        // UsersTableSeeder.phpが生成される
database/seeds/UsersTableSeeder.php
public function run(){
  DB::table('users')->insert([
    'name' => 'ユーザー1',
    'email' => 'ユーザー1@gmail.com',
    'password' => bcrypt('ユーザー1') 
  ]);
}
database/seeds/DatabaseSeeder.php
public function run()
{
  // $this->call(UsersTableSeeder::class);   // コメントアウトする
}
seederから、データを作成する
% php artisan db:seed --class=UsersTableSeeder     // データ作成
% php artisan tinker                               // 作成したデータの確認
  >>> use App\User
  >>> User::all()

コンソール操作でレコードを作成する場合

ターミナル操作で作成する方法
% php artisan tinker               // コンソール起動
  // レコード作成( インスタンスを作成して、saveメソッドを使う )
  >>> $box = new App\Box();        // インスタンス作成(※ 名前空間がデフォルトでAppなので、App\モデル名(); )
  >>> $box -> title = 'タイトル1';
  >>> $box -> content = '詳細1';
  >>> $box -> save();              // 保存
  => true                         // レコード作成成功

  >>> App\Box::all();             // 作成したデータの確認
  >>> App\Box::all()->ToArray();  // 作成したデータの確認(配列で取得)
  >>> exit
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel アウトプット

npm run watch-poll

npm run watch-pollは、Laravelをインストールした際に初めから存在するpackage.json内に定義されているコマンドのひとつです。

このコマンドは、各JavaScriptファイルを常に監視し、編集されたJavaScriptが保存されると自動的にLaravel Mixによるトランスパイルを行います。
JavaScriptの編集・保存の都度、手動でトランスパイルする必要が無くなり、開発を効率化します。
なお、npm run watch-pollを起動中のターミナルでは他のことはできませんので、何か他のコマンドを実行したい場合は別のターミナル画面を使うようにしてください。
また、npm run watch-pollを終了させる場合はcontrol + cを押してください。

clickLikeメソッド

スクリーンショット 2020-10-17 16.35.36.png
ユーザーが未ログインであれば警告のポップアップを出して、早期リターンでメソッドを終了させるようにしています。

passedValidationメソッド

フォームリクエストのバリデーションが成功した後に自動的に呼ばれるメソッドです。
バリデーション成功後に何か処理をしたければ、ここに処理を書きます。
スクリーンショット 2020-10-17 18.16.16.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

testareaの初期値(Value)が反映されない時の解決法

エラー状況

例えば下記のような入力フォームにinputエリアとtextareaエリアを実装したとする。

Todo

更新して再度開いた時に前回、更新した内容が表示できるようにしたい。
しかしinputエリアは通常に表示されているが、textareaは表示がされていない状況。

Todo

修正作業

コードを確認してみると

<div class="title-area">
  <label for="test1">タイトル</label>
  <input id="test1" type="text" name="title" value="{{$sample->title}}">
</div>
<div class="text-area">
  <label for="test2">メモ</label>
  <textarea id="test2" type="text" name="memo" value="{{$sample->memo}}" row="5"></textarea>
</div>

一見、問題ないように見えますが、
textareaにvalueを設定するのではなく、開始タグと閉じタグの間に表示されたい変数などを入れるようにコードを修正すれば、表示されると思います。

<div class="title-area">
  <label for="test1">タイトル</label>
  <input id="test1" type="text" name="title" value="{{$sample->title}}">
</div>
<div class="text-area">
  <label for="test2">メモ</label>
  <textarea id="test2" type="text" name="memo" row="5">{{$sample->memo}}</textarea>
</div>

最後に

textareaはinputと同じように書きがちなので初学者の方がハマるエラーだと思い、執筆しました。
参考になれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】今日、Laravel始めました

ビルトインサーバーでのLaravel導入についての備忘録。
MacのPHPバージョンアップ、Laravel導入、DB(MySQL)への接続まで。

環境構築(Mac)

  • 現在のPHPの最新バージョン 7.4に、Homebrewを使って、バージョンアップ。
PHPのバージョンアップ
% php -v                      // Macに入ってるバージョン確認
  PHP 7.3.11 ...
% brew search php@7           // Homebrewコマンドで、インストールができるPHP7系を検索してみる
  => Formulae
  php@7.2       php@7.3       php@7.4
% brew install php@7.4        // Homebrewを使って、7.4 をインストール
  Updating Homebrew...
         :

// インストールが完了したら、PATHを通す設定を上書きする
% echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"' >> ~/.bash_profile
% echo 'export PATH="/usr/local/opt/php@7.4/sbin:$PATH"' >> ~/.bash_profile
% source ~/.bash_profile

% brew services start php       // PHPを起動
// ターミナルを一旦閉じてから、バージョン確認してみる
% php -v
  PHP 7.4.11 ...
  • Laravel導入には、以下が必要なのでインストールする。
    • Homebrew : 導入済み
    • PHP : 導入済み
    • Composer : ライブラリやパッケージを管理し、それをもとにインストールする機能。
    • Laravel
Laravelの導入まで
// Composer インストール
% brew search composer
  ==> Formulae
  composer
  ==> Casks
  composercat
% brew install composer
% composer -v                  // 導入を確認
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
  Composer version 1.10.6 2020-05-06 10:28:10
          :
// Laravelのインストール
% composer global require "laravel/installer"
// Laravelのコマンドを使えるようにするために、パスを通す(.zshrcファイル)
% vim ~/.zshrc                // i(挿入モード)で編集し、escキーで抜け、:wqで保存して終了
  export PATH="$PATH:/Users/自分のPC名/.composer/vendor/bin"
% source ~/.zshrc            // 変更を反映
% laravel -v                 // 導入を確認
  Laravel Installer 4.0.5
          :

Laravelアプリ作成の実装手順

アプリの雛形作成

  • artisan(アーティサン)コマンド : Laravelの機能を呼び出すコマンド。
Laravelアプリの作成
% cd ~/projects
% laravel new laravel_sample    // アプリ名 「 laravel_sample 」
% cd sample
% php artisan serve             // サーバーを起動し、ブラウザで確認(localhost:8000)
                                // サーバー停止は、 control + C
  • localhost:8000 にアクセス↓(※ app/resources/views/welcome.blade.php が表示されてればOK) Alt text

laravelアプリのディレクトリ構造

ざっくりしたディレクトリ構造
・app
  └─ Http  
       └─ コントローラー     
  └─ モデル
・database
    └─ マイグレーション
・resources
    └─ ビュー
・routes
    └─ web.php (ルーティング)

タイムゾーンと言語だけ設定しとく

  • レコード保存時の時間情報の設定など。
タイムゾーンと言語の設定(config\app.php)
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',
'faker_locale' => 'ja_JP',

DB作成(mySQL)

  • DB接続には、 ホスト、ポート、DB名、ユーザー名、PW が必要。
  • Laravelでは、.envファイルに、環境変数を記載。多分、デフォルトのままでok。

DB作成のための設定

アプリ作成時に作成された.envファイル(DB関連部分)
        :
DB_CONNECTION=mysql         // DBの種類
DB_HOST=127.0.0.1           // 接続先のホスト
DB_PORT=3306                // 接続先のポート
DB_DATABASE=laravel_sample  // DB名
DB_USERNAME=root            // ユーザー名
DB_PASSWORD=                // PW(なくてok)
        :
config/database.php
'mysql' => [
                 :
  'database' => env('DB_DATABASE', 'laravel_sample'),
  'username' => env('DB_USERNAME', 'root'),
  'password' => env('DB_PASSWORD', ''),
                 :

DB作成

  • MySQLにrootでログインし、DBを作成する。
ターミナル
% mysql -u root                            // rootでMySQLにログイン
  mysql> create database laravel_sample;   // DB作成
    Query OK, 1 row affected (0.01 sec)
  mysql> show databases;                   // DB一覧で確認
  mysql> exit

DBをアプリと接続する

アプリのディレクトリ(ターミナル)
% php artisan tinker                              // 対話コマンド
  Psy Shell v0.10.4 (PHP 7.4.11 — cli) by Justin Hileman
  >>> DB::connection();                           // DBが接続されてるか確認
  => Illuminate\Database\MySqlConnection {#3238}
  >>> exit                                        // 確認できたら終了しとく
% php artisan migrate                             // マイグレーション実行
  • これで、MySQLと繋がり、空のDBが作成できたハズ。

よく使いそうな Laravel artisanコマンド

よく使いそうなコマンド
% php artisan --version             // バージョンの確認

% php artisan                      // コマンド一覧の確認方法 (引数の使い方も確認できるみたい)
% php artisan list
% php artisan make:model -h        // モデル作成に、どんなオプションがあるか?
% php artisan make:controller -h   // コントローラー作成に、どんなオプションがあるか?

% php artisan serve                // ローカルサーバー起動(8000)
% php artisan route:list           // ルーティングの確認
% php artisan tinker               // 対話コンソールの起動
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのアプリをLaravelのバージョンを指定して作成する

目的

  • Laravelアプリを作成する最にバージョンを指定して作成する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 8.6.0 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

方法

  1. Laravelアプリを作成したい環境で下記コマンドを実行する。コマンドは二通り存在する。

    • その1

      $ composer create-project "laravel/laravel=バージョン" アプリ名
      
    • その2

      $ composer create-project --prefer-dist laravel/laravel アプリ名 "バージョン"
      
  2. 例えばLaravel6の最も新しいバージョンで作成したいときは下記のようにして実行する。

    • その1

      $ composer create-project "laravel/laravel=6.*" アプリ名
      
    • その2

      $ composer create-project --prefer-dist laravel/laravel アプリ名 "6.*"
      
  3. Authによる認証機能をもたせたい場合はアプリファイル作成後アプリ名ディレクトリに移動して下記コマンドを実行し認証に必要なファイルを作成する。

    $ composer require laravel/ui "^1.0" --dev
    $ php artisan ui vue --auth
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】get〜Attributeメソッド

はじめに

今回はLaravelのget〜Attributeメソッドを利用して、欲しい値を加工する方法をまとめたいと思います。

アクセサについて

アクセサを定義するには、アクセスしたいカラム名が「studlyケース(Upper Camel Case)」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。

参考:Eloquent:ミューテタ 8.x Laravel

get〜Attributeメソッドの実装例

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザーの氏名を取得
     *
     * @param  string  $value
     * @return string
     */
    public function getFullNameAttribute($value)
    {
        return "{$this->first_name} {$this->last_name}";
    }
}

モデルにこのように定義するとこの値を使用したいコントローラー層やサービス層などで、例えば$this->full_nameのように実装すると値を取得することができます。

おわりに

いかがでしたでしょうか。
get〜Attributeメソッドはとても便利なので是非活用してみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel nginx

sudo apt update

aptコマンドの詳細はubuntuのマニュアル[英語]で説明されています。
補足ですが、upgrade、searchなど他のコマンドを実行する前には必ずupdateを実行するようにします。

次に、NGINXをインストール。

 sudo apt install nginx
確認メッセージがでるので「Y」を入力。


終わったら、正常にインストールされたか確認します。

sudo systemctl status nginx
下のように、Activeの行にactive (running)と出ていれば大丈夫です。
inactive (dead)と出ていれば起動していません。


また、2行目に … /nginx.service; enabled; と「enabled」と出ていれば自動起動がONの状態です(自動起動がOFFだとdisabledと出ます)。

これで、NGINX自体のインストールは終わり。
簡単です。

ファイアーフォールの設定
以下のコマンドで、HTTP(80/TCP)、HTTPS(443/TCP)について、クライアントからの接続を許可します。

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

試しにホスト側OSのブラウザで確認してみます。
ゲストOSのIPアドレスが分からない(忘れた)場合は、以下のコマンドで確認可能です。

ip a
sudo apt -y install mysql-server-8.0
sudo apt-get install php php-gd mysql-server php-mysql php-zip
sudo apt-get install php-mbstring php-xml php-json php-zip php7.4-cli

grep password /var/log/mysqld.log
sudo mysql_secure_installation
sudo apt-get install php7.4-sqlite3
sudo apt-get  install curl
curl -sS https://getcomposer.org/installer
sudo apt-get install composer
which composer
sudo mv composer /usr/local/bin/composer
which composer
sudo chmod 755 /usr/local/bin/composer
export PATH=/usr/local/bin:$PATH
which composer

composer global require "laravel/installer"
export PATH="$PATH:/.config/composer/vendor/bin"
source ~/.bashrc

あとは色々いれてくといいですね





  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8でのルーティングで、コントローラーの指定の仕方4選

すごい久しぶりにqiita。
久しぶりにLaravel触ろうと思ったらLaravel8が出てて、試してみる。
Laravel7以前のと比べてRouteの書き方変わってたのでメモ。
(ぜんぜん大した話じゃないけどまだインターネッツに残っていないと思ったものは積極的に残すスタイル。)

前提: 今までの書き方

Route::get('hoge/fuga', 'Hoge\FugaController@index');

Laravel7までは有効。Laravel8ではエラーになります。

1: 教科書どおりがいい派

use App\Http\Controllers\Hoge\FugaController;
Route::get('hoge/fuga', [FugaController::class, 'index']);

使うクラスはすべてuseで指定しておいたほうが見通しがいい人向け。

2: useうざい派

Route::get('hoge/fuga', [App\Http\Controllers\Hoge\HugaController::class, 'index']);

useはなくして、並んだ絶対パス眺めるのが好きな人向け。

3: 前みたいにシンプルに書きたい派

Route::get('hoge/fuga', '\App\Http\Controllers\Api\TokenController@index');

Laravel8での新作法に違和感を感じる人向け

4: 完全に前のに戻したい派

app/Providers/RouteServiceProvider.php
を変更する必要があり、コメントアウトされている

// protected $namespace = 'App\\Http\\Controllers';

のコメントアウトを外して有効にする。

Route::get('hoge/fuga', 'Hoge\FugaController@index');

で以前と変わらない書き方ができる。


ぼくは2です。
いじょー!


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[laravel]formでpost以外を指定する方法

formでpost以外を指定したいときはこんな感じになる

create.php
<form action="{{route('post.update',['post'=>$post->id])}}" method="post">
  //↓これ
    @method=('put'); 
    @csrf
    <label for="title">タイトル</label>
    <input type="text" id="title" name="title" value="$post->title">
    <input type="submit">
</form>

余談

僕はもともこんな感じでinputに入れてたけど上のようなスマートな書き方がしれてよかった。
これからは上記の書き方をしたいと思います。

create.php
<form action="{{route('post.update',['post'=>$post->id])}}" method="post">
    <input type="hidden" name="_method" value="delete">
</form>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む