Laravel: MariaDB の CRUD  API を作成

## 前提

MariaDB に次のデータを用意します。

>User: scott
>Password: tiger123
>データベース: aritcle

接続の確認

```bash
mysql -uscott -ptiger123 article
```

## 作成

<ol>
<li>プロジェクトの作成</li>

```bash
laravel new mariadb_test
```

<li>.env の修正</li>

```text:.env
（省略）
DB_DATABASE=article
DB_USERNAME=scott
DB_PASSWORD=tiger123
（省略）
```

<li>ルーティングの設定</li>

```php:routes/api.php
<?php

use Illuminate\Http\Request;

Route::group(['middleware' => ['api']], function(){
  Route::resource('articles', 'App\Http\Controllers\Api\ArticlesController', ['except' => ['create', 
'edit']]);
});
```

<li>コントローラーの作成</li>

```bash
php artisan make:controller Api\\ArticlesController --resource
```

<li>ルーティングの確認</li>
>エラーが出ないことを確認

```bash
php artisan route:list
```

```text
$ php artisan route:list

  GET|HEAD        / .......................................................... 
  POST            _ignition/execute-solution ignition.executeSolution › Spati…
  GET|HEAD        _ignition/health-check ignition.healthCheck › Spatie\Larave…
  POST            _ignition/update-config ignition.updateConfig › Spatie\Lara…
  GET|HEAD        api/articles . articles.index › Api\ArticlesController@index
  POST            api/articles . articles.store › Api\ArticlesController@store
  GET|HEAD        api/articles/{article} articles.show › Api\ArticlesControll…
  PUT|PATCH       api/articles/{article} articles.update › Api\ArticlesContro…
  DELETE          api/articles/{article} articles.destroy › Api\ArticlesContr…
  GET|HEAD        api/user ................................................... 
  GET|HEAD        sanctum/csrf-cookie sanctum.csrf-cookie › Laravel\Sanctum  …

                                                           Showing [11] routes
```



<li>モデルの作成</li>


```bash
php artisan make:model Article -m
```

> -m をつけることで、database/migrations/2024_01_05_053005_create_articles_table.php が作成されました。

<li>マイグレーションファイルを編集</li>
２行追加

```php:database/migrations/2024_01_05_053005_create_articles_table.php
（省略）
    public function up(): void
    {
        Schema::create('articles', function (Blueprint $table) {
                $table->id();
                $table->string('title');  // 追加
                $table->text('body');  // 追加
                $table->timestamps();
        });

（省略）
```

<li>マイグレーションファイルの内容をデータベースに反映</li>

```bash
php artisan migrate
```

MariaDB は次のようになります。

```text
MariaDB [article]> show tables;
+------------------------+
| Tables_in_article      |
+------------------------+
| articles               |
| failed_jobs            |
| migrations             |
| password_reset_tokens  |
| personal_access_tokens |
| users                  |
+------------------------+
6 rows in set (0.000 sec)

MariaDB [article]> 
```

<li>コントローラーの修正</li>

```php:app/Http/Controllers/Api/ArticlesController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Article;      // 追加

（省略）
```

<li>コントローラーのアクションの修正</li>

>create と edit の処理は削除

```php:app/Http/Controllers/Api/ArticlesController.php
// 略
    public function index()
    {
        //
        $articles = Article::all();
        return $articles;
    }
// 略
    public function store(Request $request)
    {
        $article = new Article;
        $article->title = $request->title;
        $article->body = $request->body;
        $article->save();
        return redirect('api/articles');
    }
// 略
    public function show($id)
    {
        $article = Article::find($id);
        return $article;
    }
// 略
    public function update(Request $request, $id)
    {
        $article = Article::find($id);
        $article->title = $request->title;
        $article->body = $request->body;
        $article->save();
        return redirect("api/articles/".$id);
    }
// 略
    public function destroy($id)
    {
        $article = Article::find($id);
        $article->delete();
        return redirect('api/articles');
    }
```

<li>API の動作を確認</li>

>サーバーを起動

```bash
php artisan serve
```

<ol>

<li>一覧の取得</li>

```bash
curl http://localhost:8000/api/articles | jq .
```

<li>特定の要素を取得</li>

```bash
curl http://localhost:8000/api/articles/11 | jq .
```

<li>データの挿入</li>

```bash
curl -H 'Content-Type: application/json' \
	http://localhost:8000/api/articles -d '{"title": "ppp","body": "テスト"}'
```

<li>データの更新</li>

```bash
curl -X PUT -H 'Content-Type: application/json' \
    http://localhost:8000/api/articles/12 -d '{"title": "ttt","body": "Test Message"}'
```

<li>データの削除</li>

```bash
curl -X DELETE http://localhost:8000/api/articles/11
```
</ol>

</ol>

## MariaDB へテストデータの投入

次のような SQL で入れます。

```sql
insert into articles set id=10, title="aaa", body="こんにちは";
insert into articles set id=11, title="bbb", body="おはよう";
insert into articles set id=12, title="ccc", body="今晩は";
```

MariaDB の状態

```text
MariaDB [article]> select * from articles;
+----+-------+-----------------+------------+------------+
| id | title | body            | created_at | updated_at |
+----+-------+-----------------+------------+------------+
| 10 | aaa   | こんにちは      | NULL       | NULL       |
| 11 | bbb   | おはよう        | NULL       | NULL       |
| 12 | ccc   | 今晩は          | NULL       | NULL       |
+----+-------+-----------------+------------+------------+
3 rows in set (0.001 sec)

MariaDB [article]>
```

## 確認したバージョン

```text
$ php --version
PHP 8.2.10-2ubuntu1 (cli) (built: Sep  5 2023 14:37:47) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.10-2ubuntu1, Copyright (c), by Zend Technologies

$ php artisan --version
Laravel Framework 10.39.0
```