💭

LaravelでDB操作

2024/12/01に公開

現在Laravelの勉強をしていてDBについてこれまで扱ってきた方法とは違うので書き残しておきます。

作業環境

作業環境はPHP8を動作させるApacheコンテナとMySQLコンテナを使用しました。docker-compose.ymlのみ記載しておきます。

version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    ports:
      - "50080:80"
    volumes:
    - ./src:/var/www/html
    depends_on:
      - db

  db:
    build:
      context: .
      dockerfile: docker/db/Dockerfile
    ports:
      - "53306:3306"
    volumes:
      - ./docker/db/my.cnf:/etc/mysql/my.cnf
      - ./docker/db/mysql_data:/var/lib/mysql
    env_file:
      - ./docker/db/db-variables.env

laravelのインスールが終了し、プロジェクトの新規作成まで完了している前提で書いてきます。

DBコンテナに接続するための設定

.envを編集します。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_database
DB_USERNAME=test_user
DB_PASSWORD=pass

DBコンテナに合わせて書き換えます。

マイグレーションファイルとモデルファイルの作成

以下のコマンドでマイグレーションファイルとモデルファイルを作成します。

php artisan make:model test -m (マイグレーションファイルも作成)

マイグレーションファイルがテーブルの構造を管理するためのファイルです。カラムの追加や制約を定義したりできます。以下のディレクトリに作成されます。

database/migrations/2024_12_01_133837_create_tests_table

モデルファイルはテーブル操作を行うためのファイルです。
以下のディレクトリに作成されます。

app/Models/test.php

マイグレーションファイルについて

まずはマイグレーションファイルを見ていきましょう、ファイル名は日付時間テーブル名を複数形にしたものになります。
以下のコードがあると思います。

public function up(): void
    {
        Schema::create('models', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

これはテーブルにidカラムとtimestampsは作成日時と変更日時を保存するものになります。nameカラムを追加してみます。

public function up(): void
    {
        Schema::create('models', function (Blueprint $table) {
            $table->id();
            $table->string('name')->nullable(false); //型('カラム名')->NOT NULL制約
            $table->timestamps();
        });
    }

上記のようにインスタンスを扱うようにしてカラムの追加が可能になります。

設定したテーブルの構造を反映

上記のようにマイグレーションファイルを編集してテーブルの構造が書けたらそれを反映していきます。
ターミナルで以下のコマンドを実行します。

php artisan migrate

dbコンテナに接続して以下のコマンドを実行して確認してみます。

USE test_database;
SHOW COLUMNS FROM tests;
+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)    | NO   |     | NULL    |                |
| created_at | timestamp       | YES  |     | NULL    |                |
| updated_at | timestamp       | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+

マイグレーションファイルに記述したnameカラムが追加されましたね。

モデルを使用してデータを保存

ターミナルから以下のコマンドを実行します

php artisan tinker

tinkerを使うことでデータの作成、更新、削除、保存が可能です。
名前空間を変数に格納します。

$test = new App\Models\test;

追加データを定義していきます

$test->name = 'test_name';

保存します。

$test->save();

データの取得を行う

次はデータの取得をおこないます。tinkerを実行します。

$data = App\Models\test::all(); //全てのデータの取得
$data = App\Models\test::find(1); //主キーが1のデータの取得

$test = App\Models\test::where('name', 'test_name')->get(); //nameカラムの値がtest_nameのものを取得

all()やfind()は->get()が必要ありませんが、他は必要あります。

データの更新を行う

次はデータの更新を行います。tinkerを実行します。

$data = App\Models\test::find(1); //主キーが1のデータの取得
$data->name = 'test_name_updated'; //データの変更

$data->save(); //データの保存

データの削除を行う

次はデータの削除を行います。tinkerを実行します。
データの取得を行います

$data = App\Models\test::find(1); //主キーが1のデータの取得
$data->delete(); //削除の実行

削除の際はsave()メソッドの実行は必要ありません。

終わりに

基礎的なDBを書きました。上記の操作をコントローラーファイルで実装することでDB操作が行えます。
Laravelの中でも特に大事な部分なのでしっかり落とし込みたいですね。

Discussion