【独学メモ】-laravel- DBやりとりに使うEloquentの概要を知る

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

# この記事の目的
DBから情報を引っ張り出す方法として、Eloquentやクエリビルダというものがあるらしい、この記事ではEloquent(エロクアント）について学んだ事を書いていく（今後書き足していく）

## 大前提
すでに、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. Eloquentってなんぞ
2. 使い方
3. へルパ関数ddちゃんを使う

# 1.Eloquentってなんぞ
DBとモデルを対応づけるLaravelのORMライブラリ。
ORMについては[前の記事](https://qiita.com/dr_tensyo/items/cf47ed75dd57de7b2780#m---model--%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)で少し触れたな・・・。なんだっけ。
ああ、そうだ。Object Relational Mappingだ。phpの構文でSQLを体現する的なやつだ（エンジニアさんにそう解釈してるって言ったら怒られそう）

つまり、laravelが用意してくれているもので「php使ってるならSQL文使わずにSQL文と同じ事したったるで」的なライブラリだと解釈しておけばとりあえずエンジニアさんとは会話できる気がした。
ざっといろんな記事をみると、簡単なCRUD処理をするには、Eloquent、テーブル結合などしてデータ引っ張ってきたりしたい、とかの複雑なやりとりについては、クエリビルダを使う事になるっぽい。

# 2.使い方
DBとのやり取りを担当してくれるModel上で、Eloquentライブラリを認識させて、そこで使ってあげるのが基本的な使い方のよう。

なので、まずはEloquentを使いたいモデルに、useで記述を追加してあげて認識させてあげることにしましょう。

:::note info
多分、Model作成時に勝手にEloquentも使えるようになってると思われる。
:::


## Modelの中身
こんな感じで、生成後に既にライブラリを読み込めるように記述されているっぽい。
```Models/Test.php
<?php

namespace App\Models;

// 多分、こんな感じでModel作ったタイミングで既に記載されていると思う
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    use HasFactory;
}
```

上に書いたTestモデルをTestController内にuse文を使って認識させてあげる。こうすることで、Controller上でも使えるっぽい。

```Http/Controllers/TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

// モデルを使えるようにuseでモデルを記述する
use App\Models\Test;

use Illuminate\Support\Facades\DB;

class TestController extends Controller
    {
        public function index(){
    }
}

```

## 早速データを取得してみる
取得方法はいろいろある。
で、取得方法によっては型が違ったりもする。
この辺りは公式ドキュメント[「Eloquentの準備」](https://readouble.com/laravel/9.x/ja/eloquent.html)ページを参照してみるといいのかも。

### 書き方
使いたいModelのクラス名と使いたい関数をこんな感じに記述します↓
`{対応したモデルの名前}::{使いたい関数};`
今回は`Test`モデルを作成しているので、`Test::{使いたい関数}`となります。

#### 記述例
関数はいっぱいあるので、以下みたいな感じで何個かパターンを記載しておきます。

```Http/Controllers/TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

// モデルを使えるようにuseでモデルを記述する
use App\Models\Test;

use Illuminate\Support\Facades\DB;

class TestController extends Controller{
    // Eloquent機能を使ったDBからのデータ取得方法
    $values = Test::all();        // 全部拾ってくる
    $count = Test::count();       // データの数をカウントして拾ってくる
    $first = Test::findOrFail(1); // DBのid1を拾ってくる。なかったらエラーを返す。
}
```

使う関数によってデータ型が変わってくるのも特徴です。
代表的な部分で言うと・・・
`all();`や`get();`はcollection型、
`where();`や`find();`はbuilder型、
`count();`はInt型
になるっぽい。
この辺りは使いたい用途によって使う関数が変わると思うので、関数とやりたい事をしっかり考えつつ扱うようにしないとですね。

# 3.へルパ関数ddちゃんを使う
データの取得方法がわかったぞ。
でもさ、取得方法によってデータ型が変わったりするって事は関数それぞれの型全部把握しておかないとダメなの？
って思うそこのあなた。大丈夫、安心してください。確認できますよ。
こんな時に役立つのがへルパ関数`dd（）`ちゃんです。

## 覗き見が得意な`dd()ちゃん`
`dd(変数);`とする事で、引数で指定した変数がどんな状態なのかまる変わりです。
php界の篠山紀信です。
この変数がどんな型なのか、今どんな物が変数の中にあるのかがわかります。

```Http/Controllers/TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

// モデルを使えるようにuseでモデルを記述する
use App\Models\Test;

use Illuminate\Support\Facades\DB;

class TestController extends Controller{
    // Eloquent機能を使ったDBからのデータ取得方法
    $values = Test::all();        // 全部拾ってくる
    $count = Test::count();       // データの数をカウントして拾ってくる
    $first = Test::findOrFail(1); // DBのid1を拾ってくる。なかったらエラーを返す。

    /* こんなふうに一つの変数を指定することもできれば
     dd($values);
    ↓のように複数指定することもできます。
     この場合であっても視認性悪くないです。
    */
    dd($values, $count, $first);

}
```

この状態で、該当のURLにアクセスするとこんな感じで表示されます
![スクリーンショット 2023-05-21 12.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/0985406c-4a83-1e16-0bd1-d1447539feb4.png)
▶︎マークをクリックすることで、より詳細に中身を見ることができます。
（とはいえ、今の僕の知識だと、KeyTypeでデータ型がなんなのか、とかその程度しかわかりませんが)

これを使うことで、指定した変数が今どういう状態なのかを把握することができる。
ので、扱いたいけどうまく扱えない時はdd()ちゃんの力を借りてうまく手綱を引いてくようにがんばりましょうって感じですね。

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