【Laravel】Laravelデータベースの基本！

#Laravelでデータベースを使うなら
Laravelでデータベースを使うなら、DBクラスかEloquentのどちらかを使います。
####DBクラス
データベースアクセスのための基本的な機能をまとめたクラス。クエリビルだという機能も用意されている。
####Eloquent
ORMを実装したもの。
>ORMの説明(Wikipediaより引用)
>>データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。

###前提知識　CRUD
データベース操作の基本はCRUD(Create,Read,Update,Delete)の実装です。
SQLでは(INSERT,SELECT,UPDATE,DELETE)が対応する。

#1.DBクラス
###必要な手続き
####データベースを設定する
config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。

```
'default' => env('DB_CONNECTION', データベース名),
```
####環境変数を設定する
.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。

```
DB_CONNECTION=データベース名
DB_DATABASE=使用するデータベースファイルのパスを指定
```
####コントローラの修正
DB:selectで指定したSQL文を実行し、データベースからレコードの情報を取り出します。

```
use Illuminate\Support\Facades\DB;
$変数 = DB::select(実行するSQL文);
```

#####DBクラス内でのCRUD
冒頭でCRUDについて述べたと思うのですが、DBクラスでは以下の静的なメソッドを用います。

| CRUD      |    メソッド  |
|:----------------:|:------------------|
| C             |DB::insert(クエリ文,パラメータ配列);|
| R           |            DB::select(実行するSQL文); |
| U             |         DB::update(クエリ文,パラメータ配列);| 
| D               |         DB::delete(クエリ文,パラメータ配列); |    

####テンプレートの修正
@foreachディレクティブなどを使用してデータを活用します。
ディレクティブに関しては以下の記事に記載してあります。

 - [【Laravel初心者による備忘録】Bladeの主要ディレクティブ一覧](
https://qiita.com/nyax/items/7f949bcb331b7221e593)


##クエリビルダ
LaravelのDBクラスにはクエリビルダという機能が用意されています。
`クエリビルダ＝SQLのクエリ文を生成するために用意されたメソッド`


#2.Eloquent
###必要な手続き
####データベースを設定する
config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。

```
'default' => env('DB_CONNECTION', データベース名),
```
####環境変数を設定する
.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。

```
DB_CONNECTION=データベース名
DB_DATABASE=使用するデータベースファイルのパスを指定
```
####モデルの作成
artisanコマンドでモデルを作成します。作成されたモデルはappフォルダに配置されます。

```
php artisan make:model モデル名
```
クラスの中身は何も書いなくても、継承元である Model クラスで様々な設定を読み取ってくれます。
例えばこのモデルクラスがどのテーブルに対応しているかはクラス名から自動的に推定されます。つまりモデルクラスのクラス名の複数形のテーブルが対応していると解釈されるのです。デフォルトの推定に当てはまらない場合は追加で設定を書きます。

####コントローラに以下追加

```
use App\モデル名;
$変数 = Folder::all();
```
#便利なツール
シーディングとマイグレーションはどちらの手法でも使える便利なものです。

##シーディング
`シード＝最初から用意しておくコード`
シーディングとはシードを作成する機能のこと。
初期状態でダミーのデータがあると便利。
#####シーダーファイルの作成
artisanコマンドでシーダーファイルを作成します。作成されたシーダーファイルはdatabase/seedsフォルダの中に配置されます。

```
php artisan make:seeder シーダー名
```
このファイルのrunメソッドにシーディング処理を記入します。

#####シーディングの登録
このシーダーファイルをdatabase/seeds/DatabaseSeeder.phpに登録します。
runメソッドに以下のように記入してください。

```
$this->call(シーダークラス::class);
```

#####シーディングの実行
以下のコマンドを使用してシーディングを実行します。

```
php artisan db:seed
```
##マイグレーション
現在使っているデータベースと全く同じ構造を再現するための仕組みのこと。データベースの移行したり、環境を移行したりする際に一からデータベースを作り直しのは大変。データベースを効率よく管理したいなら、マイグレーションを利用するべき!

#####マイグレーションファイルの生成
以下のコマンドを実行してマイグレーションファイルを作成します。

```
php artisan make:migration ファイル名
```
database/migrationsの中に生成したマイグレーションが追加されます。

生成したファイルの中にはMigrationを継承したクラスが作成されています。このクラスにつのメソッドが用意されています。

- upメソッド(テーブルを生成するための処理)
- downメソッド(テーブルを消去するための処理)

それぞれ必要な処理を記述します。

######主要な型の設定

|       説明 |    コマンド|
|:-----------------:|:------------------:|
|            プライマリキー |     $table->increments(フィールド名);       |
|              整数 |        $table->integer(フィールド名);        |
|            実数 |       $table->float(フィールド名);       |
|            文字 |       $table->String(フィールド名);       |
|            真偽値 |       $table->boolean(フィールド名);       |
|            日時 |       $table->dateTime(フィールド名);       |
|           NULL値可能なcreated_atとupdated_atカラム追加 |       $table->timestamps();       |

#####マイグレーションの実行
以下のコマンドを実行してマイグレーションを実行する。

```
php artisan migrate
```

コンソールにメッセージが出力され、テーブルが用意される。

##多くのチュートリアルでは・・・
以下のチュートリアルでは、マイグレーションを作成しEloquentを用いてデータベースを作成していました。

 - [【Laravel 5.7対応】掲示板を作成するチュートリアル](https://blog.hiroyuki90.com/articles/laravel-bbs/)
 - [Laravel5.4でシンプルなCMSを作るチュートリアル](https://www.webopixel.net/php/1259.html)
 - [Laravel 5.5 入門として「基本のタスクリスト」を作成する [その1]](https://beiznotes.org/making-task-list-with-laravel55-1/)
 - [入門Laravelチュートリアル (3) ToDoアプリのフォルダ一覧表示機能を作る](https://www.hypertextcandy.com/laravel-tutorial-todo-app-list-folders)


##個人的に苦しんだエラー特集
以下の記事を参考にしてDockerの環境を構築しました。

 - [初心者がLaradockでLaravelを開発するための準備の仕方をまとめるよ](https://liginc.co.jp/465420)
 - [Laravelの開発環境をDockerを使って構築する](https://qiita.com/ucan-lab/items/17c806973e69792ada99)


目的が果たせればOKと判断して雰囲気でDocker使ってたので、今回苦労しました(･･;)　夏休みあたりにちゃんとDocker勉強します😢
###Dockerでマイグレーションが作成できない
.envの`DB＿HOST`をデフォルト設定から変更する必要がある。docker-compose.ymlでserviceとして定義した名前を使用する。

###docker-compose up できない
以下のエラーが出てコンテナを起動できなかった。

```
ERROR: Encountered errors while bringing up the project.
```
DockerをQuitしてもう一度するとできた。

###phpMyAdminにログインできない
環境変数内(.env)のユーザーネーム、パスワード、サーバ名、全て同じものを使用してログインを試みたのに何度試しても失敗。
もう一度コンテナを作り直したら解決した。原因不明🤣
このエラー解消に恐ろしく時間取られたのが本当に悔しい...！

##参考
 - [CRUDとは？データベースの基本的な処理](http://www.irohabook.com/crud)
 - [Laravelのクエリビルダ記法まとめ（QueryBuilder/DB Facade）](https://www.ritolab.com/entry/93)
 - [Laravel学習帳](https://laraweb.net/category/tutorial/)
 - [Docker上のLaravelでDBをmigrateしたらエラー(could not connect to server: Connection refused)になった話](https://qiita.com/shonansurvivors/items/90beda0c2a109ade9a8b)
 - [Laravelの環境をDockerで構築するチュートリアル](https://windii.jp/backend/laravel/laravel-with-docker-compose)

※ この備忘録目的の記事です