【Laravel】PostgreSQLをlaravelで使ってみよう!

どーも!

今回はlaravelでPostgreSQLを使ってみます!

実際にLaravelのコード内でDB操作を行います!

ちなみにDBの準備ができていない方は以下を参考に、postgreSQLを準備してから読むとハンズオンでできるかと思います。

laravelの.envを修正する

さて、まず最初にlaravelでDBに接続するための情報を書いてあげる必要があります。

その情報が書かれているのが、"config/database.php"です。

デフォルトだとこんな感じのはず。

<?php

use Illuminate\Support\Str;

return [

    /*
    |--------------------------------------------------------------------------
    | Default Database Connection Name
    |--------------------------------------------------------------------------
    |
    | Here you may specify which of the database connections below you wish
    | to use as your default connection for all database work. Of course
    | you may use many connections at once using the Database library.
    |
    */

    'default' => env('DB_CONNECTION', 'mysql'),
...
...

ここで細かい値を修正してあげる必要があるんですが、実はここは書き換えません。

postgreSQLの記述箇所は以下なんですが...

    'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

よくみていただくと、env()というメソッドがたくさんありますね?

これ、実はlaravelの.envファイルの環境変数を読みに行くよ〜っていうメソッドになっています。

例えばdatabase項目を見ると...

 'database' => env('DB_DATABASE', 'forge'),

こうなっていますね。

これは、.evnファイルの中に"DB_DATABASE"の値があるなら、それを使って、ないなら"forge"と言う文字列を使うねー!っていう意味です。

環境変数周りはここが参考になるので、もうちょっと詳しく知りたい方はみてみてください!

なので、今回実際に編集するのは.envファイルを編集します。

プロジェクトフォルダ直下に".env"というファイルがあるので、開いてみます。(ファインダーだとドット始まりのファイルが非表示になっている可能性があるので、CUI(ターミナル)にて"ls -a"で探すか、設定をした上で、ファインダー上から探してみてください。

開くとただただ定数定義がずららぁ〜っと書かれているファイルになっているはずです。

その中からDB周りのことが書かれている部分を探します。

そして、そこを以下のように修正します。

LOG_CHANNEL=stack
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=takapon-test
DB_USERNAME=takapon
DB_PASSWORD=takapon

"DB_DATABASE"はpsqlにて作成したデータベース、その下にはそのDBの所有ユーザ名と、パスワードを入れます。(作成方法等は別記事参照)

これで、DB接続に必要な情報が設定されました!

マイグレーションを実行する

さて、それでは次にマイグレーションを実行します。

マイグレーションというのは、今までのDBの変更履歴を記録しつつ、DBの作成や削除を行い、いつでもロールバック(元の状態に戻せる)ようにするための機構的な感じだと思います...!(あんまり詳しくないですが...)

詳しく知りたい方は以下を!

では早速ですがマイグレーションを実行してみます。

以下をlaravelのプロジェクト下にて実行してみてください。

php artisan migrate

すると、以下のようなものが出たらいい感じです。

Takapon:MyProject taka$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.01 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0 seconds)

では、ターミナルを複製(Command+t)して、DBを直接みに行ってみましょう。psqlコマンドでアクセスし、"\d"で確認します。

ここら辺は最初に貼った記事を参考にしてもらえればと思います。

Takapon:~ taka$ psql -U takapon takapon-test
psql (12.2)
Type "help" for help.
takapon-test=> \d
                List of relations
 Schema |       Name        |   Type   |  Owner
--------+-------------------+----------+---------
 public | migrations        | table    | takapon
 public | migrations_id_seq | sequence | takapon
 public | password_resets   | table    | takapon
 public | users             | table    | takapon
 public | users_id_seq      | sequence | takapon
(5 rows)

マイグレーションの履歴が残る"migrations"テーブル、passwort_reset, usersテーブル、また、typeがsequenceとなっているものは各テーブルの主キー用の"id"に一意な値を生成するために作成されているようです。

もちろん、テーブルを作っただけなので、中身は空です。

Takapon-test=> select * from password_resets;
 email | token | created_at
-------+-------+------------
(0 rows)

takapon-test=> select * from users;
 id | name | email | email_verified_at | password | remember_token | created_at | updated_at
----+------+-------+-------------------+----------+----------------+------------+------------
(0 rows)

実はマイグレーションの流れは...

  • マイグレーション用のファイルを作成する
  • マイグレーションのコマンド叩く

というふうに、ファイルの準備をする必要があるのですが、laravelはデフォルトで、use情報とパスワードリセットを扱うための基本的なテーブル作成用ファイルが用意されています。

それによって、マイグレーションを行えばDBに対してユーザーテーブル、パスワードリセットテーブルといったものが作成されるようになっています。

マイグレーションファイルの作成についてはまた時間があれば調べてみます。

とりあえずlaravel上でデータを追加してみましょう。

Userモデルを作成する。

さて、laravelでデータベースを使う前に、もうちょっとだけ準備しましょう!

俗にいうモデルというものを作成します。

このモデルは、laravelとDBのやりとりを仲介するような立ち位置にあるものと思ってもらえればいいかと思います。

やり方は簡単です。

以下のコマンドを入力するだけ。

php artisan make:model User

これで、"app/User.php"というファイルができていればOKです。

このUser.phpが俗にいうモデルになります。

また、この"User"という命名にすることで、psqlのDBのうち、"users"というテーブルと紐付けが行われ、いい感じこの"User"モデルを介して"users"テーブルに保存したり、逆に値を取得したりできるようになります。

tinkerでDBに値を追加してみる

さて、それでは簡単にusersテーブルいデータを追加してみましょう!

tinkerをターミナルにて起動します。

$ php artisan tinker

tinkerがよくわからないよ!って方は以下を参照してみてください!

起動ができたら、Tinkerにて以下のように入力してみてください。

>>> $user = new App\User();
=> App\User {#2978}
>>> $user->name = "Taka";
=> "Taka"
>>> $user->email = "Taka@pon";
=> "Taka@pon"
>>> $user->password = "Takapon";
=> "Takapon"
>>> $user->save();
=> true

まず最初に$userとして、先ほど定義したモデルのインスタンスを作成します。

これがモデルインスタンスです。

このモデルインスタンスに対して、psqlの各カラムの値(nameやemail,passwordなど)を入れてあげ、最後にsave()することで、実際にデータベースに保存することができます。

つまり、上記では先に入れるものを集めた箱を用意して、それを最後の最後に全部DBに入れ込む!っということをやっているわけです。

実際にpsqlの方で直接中身を確認してみると...?(形崩れちゃうので画像でw)

いい感じになりましたね!

さっきの値を取得してみる

さて、それでは先ほどの値を取得してみましょう。

さっきはDBへ登録しましたね。

今度は取得です。

>>> $getuser = App\User::where('id', 1)->first();
=> App\User {#2976
     id: 1,
     name: "Taka",
     email: "Taka@pon",
     email_verified_at: null,
     created_at: "2020-02-23 04:29:46",
     updated_at: "2020-02-23 04:29:46",
   }
>>> $getuser->name;
=> "Taka"
>>> $getuser->email;
=> "Taka@pon"
>>> $getuser->password;
=> "Takapon"

最初にUserテーブルの"id"が1のデータを取得してきて、Userインスタンスとして$getuserを作成しています。

そして、その$getuserからそれぞれの値を別々で取り出しています。

ここで、passwordが最初の取得時にないじゃないか!

と気になる方がいるかもしれませんね。

これは、Userモデル作成時にその値がhiddenに設定されている場合、見かけ上は表示されないようになります。

// App\User.php
...
...
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
...
...

ただ、値としてはちゃんと取得してきているので、その後の値取得はできているといった具合です。

ここらへんは詳しくないのですが...

おそらくバグ発生時などにこのモデルの中身が全て表示されてしまったりして、不都合が減るようにといった配慮もあるのかな...?たぶん...

まぁ、とはいっても危険性は多々あるのでパスワードのような重要な情報は暗号化してDBに入れるのが当たり前になっていますね。

まとめ

さて、今回はlaravelにてpostgreSQLを簡単に使ってみました!

実際に使えるようになったので、これからモデル周りも色々といじっていこうかなぁ...と。

暇があればですけどねっ!w

それでわ!

おすすめの記事