【独学メモ】-laravel- コントーラー経由でモデルを使ってDBの情報を取得する

# 前書き
この記事は自分のための学習アウトプットメモです。
職場でphpを利用してシステムを運用しているので、ある程度の知識を得ておきたいと思い学習を開始しているだけなので、どうぞ暖かく見守ってくれたら嬉しいです。

# この記事の目的
コントローラー上でモデルを利用することでDBから情報を取得する

## 大前提
すでに、phpMyAdmin上にDBは作成済み。
DBの構成は以下。
![スクリーンショット 2023-04-15 18.51.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/e43ffac6-1da7-a97f-d3fd-9d50c8763d66.png)


# 工程
1. Tinkerを使って、DBにレコードを追加する
2. コントローラーにモデルを認識させる
3. コントローラーでDBの情報を拾ってくる
4. view上で、DBから拾ってきた内容を利用する


# 工程1. Tinkerを使って、DBにレコードを追加する
phpMyAdmin上からレコードを追加することも可能だけど、せっかくなので、ターミナル上から追加とかもできるようになっておこう。そっちの方がエンジニアっぽいし...?

## tinkerでレコード登録
と、言うことで早速行ってみましょう。
tinkerを実行すると、CUIでコマンド実行できるようになるので(勝手にtinkerモードって呼ぶ）、モデルをインスタンス化して、インスタンス化したモデルにレコードとして登録したい文字列を変数で渡す。それをsaveメソッドでDBに書き込む。的なことをやります。

### 手順1. ターミナル上でtinkerを実行する
ターミナルでプロジェクト配下に移動した後、以下を実行する。そうするとレコード登録とかそういったことができる状態になります。

```
php artisan tinker
```

### 手順2. まずはモデルをインスタンス化
DBとモデルは1対1の関係（だと勝手に思っている）ので、今回レコードをインサートしたいDBと紐づいているモデルをインスタンス化する必要があります。
今回はTestモデルに紐づいているtestsテーブルにレコードを追加したいので、Testモデルをインスタンス化します。
```
$test = new App\Models\Test;
```
※`App\Modesls`はnamespaceとしてTest.phpで定義されている前提です。
`Test.php`の中身を見て、namespaceが定義されていなければ追記して定義してあげましょう！
```Test.php
// namespace を記述
namespace App\Models;
```

### 手順3. カラムにインサートしたい値を、モデルの変数を使って準備する
インスタンス化したモデルは、紐づくテーブルのレコードを変数として持っているっぽいです。
今回はtestテーブルの中に、カラムとして`text`があるので、モデルにもtext変数が存在しているはずです。
と、いうことなので、text変数の中にインサートしたい文字列を追記します。
今回は`八宮めぐるも好きだし桑山千雪も好きだし一人だけをプロデュースなんてできないよ`をインサートします。
```
$test->text = "八宮めぐるも好きだし桑山千雪も好きだし一人だけをプロデュースなんてできないよ";
```
これであとは、インサートするだけです。

### 手順4.　saveメソッドを使ってインサート
特段何かいう必要なしです。Modelクラスの中にインスタンスメソッドとしてsaveメソッドが用意されているので、それを使うことでDBにインサートができます。
Testモデルのプロパティとして"text"があり、その中にさっき格納した`八宮めぐるも好きだし桑山千雪も好きだし一人だけをプロデュースなんてできないよ`があるので、saveメソッドを利用してそれをDBにインサートする訳ですね。
```
$test->save();
```
これでDBにレコートが追加されているはずです。

# 工程2. コントローラーにモデルを認識させる
ルーティング処理を記述した時と同様に、useを使ってコントローラーにmoderuを認識させます。
今回使いたいのはTestControllerで、そこからTestモデルを利用したい。だから↓をかきます。
```TestController.php
// namespace + \対象のモデル名
use App\Models\Test;
```

# 工程3. コントローラーでDBの情報を拾ってくる
[前の記事で作ったindexメソッド](https://qiita.com/dr_tensyo/items/f2d7a681a289adbc008b#index%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B)に記述を追加してDBの情報を拾う + viewに拾った情報を渡す。までを追記します。

```TestController.php
public function index(){
    $values = Test::all();

    /*変数の中身を見る時はddメソッドを使うといい
        dd($values);
    */

    // compactメソッドの引数にvaluesを記述することで$valuesとして取得している中身をview上で利用できる
    return view('tests.test', compact('values'));
}
```

## 解説
追記した記述について解説。
### $values = Test::all();
`モデル名::all();`と記述することで、モデルに紐づいたテーブルのレコードを全て取得することができます。
個人の学習レベルであればall()で全部拾ってきちゃうのは全然アリだとは思うけど、実業務だと負荷かかりそうだから、必要なものを絞り込んで拾ってあげた方がいいのかもなって思う。
ここでは、$valuesという変数を用意して、Testモデルを経由してtestテーブルに登録されている全てのレコードを取得している。といった動きになります。

### return view('tests.test', compact('values'));
tests.testというviewを使いますよ。という指定を第一引数でしています。これは前回の記事で書いたまま。
今回は、第二引数を追加していて、これをすることで、viewに対して取得したDBだったりを渡すことが可能になります。
compact()メソッドはlaravelが用意してくれているメソッドで、viewで要素を渡してあげる事を可能にしているっぽいです。
今回は$valuesの中身を渡したいので、引数に`values`を記述してます。

# 工程4. view上で、DBから拾ってきた内容を利用する
さて、viewにDBの情報を渡してあげたので、それを利用して表示してあげましょう。
`compact`メソッドで配列としてviewに渡しているので、viewではその配列をforeachメソッドを使って展開してあげればいいってことになりますね。

```test.blade.php
/*
    compact(values)として変数を渡しているので、view上では$valuesとして扱う
    foreach文の具体的な内容は割愛（ある程度理解していると思ってるので）
*/
@foreach($values as $value)
    {{$value->id}}<br>
    {{$value->text}}<br>
@endforeach
```
こうすることで、テーブルのidカラムとtextカラムを配列で全部表示します。
なんか二重で鉤括弧つけるのは不思議な感じ。
実行結果は以下。
![スクリーンショット 2023-04-15 19.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/7db5607b-3cf6-c1e1-919c-906848488b90.png)

よし、うまくいったな！
発展系としては、間にif文とかを使うことで、表示する内容を変えたりすることも可能ですね。
例えばidが偶数だったら表示しない。とかも可能ですよね。

# 最後に
基本的に自分向けのメモなので、参考にする方などはいらっしゃらないと思いますが、
もしどなたか有識者がこの記事を目にして「あ、いやなんかそこ認識違うぞ」と思う箇所あればご指摘いただければ幸いですm(_ _)m
（そのためにあえてこの駄文を公開設定しているので・・・笑)