Laravelでのデータベースの利用方法

## データベース利用の主な方法
- DBクラス（SQLクエリを直接実行）
- DBクラス（クエリビルダ）
- Eloquent

以上の3つが代表的な利用方法です！
1つずつ説明していきます！
### DBクラス（SQLクエリを直接実行）
SQLを扱えるのであればこの方法は抵抗なく利用することができるでしょう！
早速サンプルコードを見ていきます
#### SELECT文
```php
$users = DB::select('select * from users');
```
ここで使っている`DB::select`というのがデータベースからデータを取り出す処理です。
`DB::select`はSQLクエリを実行して結果となるレコードを取得するものです。引数には実行するSQLのクエリ文を文字列として用意しておきます！
#### INSERT文
```php
public fuction create(Request $request)
{
    $param = [
        'name' => $request->name,
        'age' => $request->age,
        'mail' => $request->mail,
    ];
    DB::insert('insert into users(name, age, mail) values(:name, :age, :mail)', $param);

    return redirect('/home');
}
```
ここでは、送信されたフォームの内容をもとにレコードを作成をしています。まず`$param`にフォームの値を保管します。
後は、この配列をパラメータ引数にして、`DB::insert`を呼び出して実行しています！

このようにSQL文をある程度扱える方であればLaravelでもSQL文を作成してデータベースとのやりとりが可能となっています！

ただこの方法はあまり使われていない印象です。SQLが分かっていれば簡単ですが、何より「バグが紛れ込みやすい」という欠点があります。渡される値の内容によっては予想外のSQL文が実行されてしまう危険があります。

ということで他の方法も見ていきましょう！

## クエリビルダ
DBクラスにはクエリビルダと呼ばれる機能が用意されています。メソッドチェーンを使ってデータベースアクセスが行えるようになります。
「クエリビルダ」とはSQLのクエリ文を生成するために用意された一連のメソッドです。メソッドチェーンとして連続して呼び出していくことで、クエリ文を内部で生成して実行することができます！
```php
$users = DB::table('users')->get();
```
この`DB::table`は指定したテーブルの「ビルダ」を取得します。
`get()`はSQLのselect文に相当するものと考えてください！
```php
$users = DB::table('users')
    ->where('name', 'いしかわ')
    ->orWhere('name', 'おかばやし')
    ->get();
```
where()はSQLのwhere句に該当するものです。引数にカラム名と値を指定することで条件に合致するデータを取得します。
whereメソッドに3つの引数を持たせて、呼び出すこともできます。
```php
$users = DB::table('users')
    ->where('id', '<=', '10')
    ->get();
```
こうすることによって`id`が`10`以下のデータに絞って取得することができます！
#### insert文
```php
$param = [
    'name' => ひらた,
    'age' => 34,
    'mail' => hirata@gmail.com
];
$users = DB::table('users')->insert($param)
```
このようにクエリビルダを利用すれば直接SQL文を作成しなくてもデータを取得したり、データの新規作成ができたりします！

## Eloquent
Laravelには`Eloquent`というものが用意されています。「モデル」と呼ばれるクラスを定義して、これを利用してデータベース操作を行うように設計されています。「モデル」とはテーブルの内容を定義したクラスです。
`usersテーブル`に紐づく`Userモデル`を作成してみましょう！
```php
php artisan make:model User
```
このコマンドを打つことによってapp/配下に`User.php`というファイルが作成され、`usersテーブル`と`Userモデル`が紐づくことになります。
このUserモデルを他のファイルで利用するには`use`してあげる必要があります。
```php
use App\User;
```
#### Userモデルで全レコードを取得
```php
$users = User::all();
```
これだけでusersテーブルから全レコードを取得することができます。
SQLを一切使わずにデータベースを利用できて直感的でわかりやすいですよね！
また、Eloquentもクエリビルダ同様メソッドチェーンを利用してデータベースアクセスができます。
```php
$users = User::where('age', 36)
    ->where('name', 'おおしま')
    ->first();
```
#### 新規作成
```php
$user = new User;
$user->name = 'やなぎ';
$user->age = 28;
$user->mail = 'yanagi@gmail.com';
$user->save();
```
#### 更新
```php
$user = User->find($request->id);
$user->name = 'おがさわら';
$user->age = 24;
$user->mail = 'ogasawara@gmail.com';
$user->save();
```
#### 削除
```php
$user = User->find($request->id)->delete();
```

### まとめ
このようにSQLを書かなくてもデータベースのとやりとりができてとても便利ですね！
LaravelにはEloquentがあるからSQLの知識はなくてもいいと思うかもしれませんが個人的にはSQLの知識は必須だと思います。その理由はEloquentを使ってデータを取得した際に、もしエラーになったら結局SQL文をみてどこが間違っているのかを探すからです。この時SQLがわからなければエラーを解消することはできません。
Laravelを使うときも基本的なSQLの知識は身につけておきましょう！
基本的にはLaravelではEloquentを使うことを推奨しますが、Eloquentのデメリットもありまして、取得するデータ量が大容量の時には処理速度が遅くなることがあります。その際にはクエリビルダを利用することをお勧めします！クエリビルだの方が処理速度が少し速くなります。



この記事は以下の書籍を参考に執筆しました。
[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

## 余談
```php
$posts = Post::where('title', 'Laravel')
    ->where('body', 'like', '%' . $keyword . '%')
    ->orderBy('id', 'asc')
    ->limit(5)
    ->get();
```
上記のようなコードの場合個人的には`query()`を使って条件部分のインデントを揃えて可読性をあげるようにしています。
```php
$posts = Post::query()
    ->where('title', 'Laravel')
    ->where('body', 'like', '%' . $keyword . '%')
    ->orderBy('id', 'asc')
    ->limit(5)
    ->get();
```
`query()`を使うのは割と少数派のようですが、、、

一応`query()`を使うメリットもありまして、
バッチ処理でデータ更新をするときには
```php
$posts = Post::update(['title' => '更新']);
```
上記では出来なくて
```php
$posts = Post::query()->update(['title' => '更新']);
```
`query()`を使うとできるみたいです！
他にも`query()`を使うメリットがあるみたいなので`query()`派が多数派になっていくかもしれません。