Laravel + Vite でCRUDを使うアプリケーションを作る(DB作成編)

https://qiita.com/inazawaKeisuke/items/cf78d7262ade9967ca47

こちらの記事の続きになります。

結局何もいいアイディアは思い浮かばないので管理者、ユーザーのいる Todoアプリケーションでも作ろうと思います。

想定としては、企業の上司と部下がいて上司は部下たちのTODOを見れるようになっていてカテゴリーとかを設定できるTODOアプリみたいなイメージです。

今回はDBを作成したいと思います。
まずはER図を書きました。こんな感じで作ろうと思います。

![スクリーンショット 2023-09-29 22.17.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/749f5358-5554-2949-3c5f-c6384336137c.png)


Mysql Work BenchでER図を作成すると、DDL文を生成できます。こちらを活用してsqlを作成します。

```SQL
-- -----------------------------------------------------
-- Schema mysql_test_db
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mysql_test_db` DEFAULT CHARACTER SET utf8 ;
USE `mysql_test_db` ;

-- -----------------------------------------------------
-- Table `mysql_test_db`.`enterprises`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test_db`.`enterprises` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `is_enable` VARCHAR(45) NULL,
  `update_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mysql_test_db`.`admins`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test_db`.`admins` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `login_id` VARCHAR(45) NULL,
  `password` VARCHAR(256) NULL,
  `is_enable` VARCHAR(45) NULL,
  `enterprise_id` INT NOT NULL,
  `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  INDEX `fk_Admin_enterprise_idx` (`enterprise_id` ASC) ,
  UNIQUE INDEX `login_id_UNIQUE` (`login_id` ASC) ,
  CONSTRAINT `fk_Admin_enterprise`
    FOREIGN KEY (`enterprise_id`)
    REFERENCES `mysql_test_db`.`enterprises` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mysql_test_db`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test_db`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `login_id` VARCHAR(45) NULL,
  `password` VARCHAR(256) NULL,
  `enterprise_id` INT NOT NULL,
  `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `login_id_UNIQUE` (`login_id` ASC) ,
  INDEX `fk_user_enterprise1_idx` (`enterprise_id` ASC) ,
  CONSTRAINT `fk_user_enterprise1`
    FOREIGN KEY (`enterprise_id`)
    REFERENCES `mysql_test_db`.`enterprises` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mysql_test_db`.`categories`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test_db`.`categories` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `enterprise_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_group_enterprise1_idx` (`enterprise_id` ASC) ,
  CONSTRAINT `fk_group_enterprise1`
    FOREIGN KEY (`enterprise_id`)
    REFERENCES `mysql_test_db`.`enterprises` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mysql_test_db`.`todos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mysql_test_db`.`todos` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NULL,
  `content` VARCHAR(1000) NULL,
  `user_id` INT NOT NULL,
  `enterprise_id` INT NOT NULL,
  `group_id` INT NOT NULL,
  `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  INDEX `fk_todo_user1_idx` (`user_id` ASC) ,
  INDEX `fk_todo_enterprise1_idx` (`enterprise_id` ASC) ,
  INDEX `fk_todo_group1_idx` (`group_id` ASC) ,
  CONSTRAINT `fk_todo_user1`
    FOREIGN KEY (`user_id`)
    REFERENCES `mysql_test_db`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_todo_enterprise1`
    FOREIGN KEY (`enterprise_id`)
    REFERENCES `mysql_test_db`.`enterprises` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_todo_group1`
    FOREIGN KEY (`group_id`)
    REFERENCES `mysql_test_db`.`categories` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
```

これをDBコンテナ内で実行、もしくはMysqlWorkbenchで接続してsqlを実行するとデータベースが作成できます。
一つの方法として DBコンテナにアクセスして実行する方法を書いていこうと思います。

まず、以下のコマンドでDockerのDBコンテナにアクセスします。
```
docker compose exec db bash
```
DockerのDBコンテナに入ると以下のコマンドでMysqlに入ります。
```
mysql -u DBユーザー名(今回だとadmin) -p
```
そして Mysql内で上のsqlをコピペするとDBを作成できます。

そして以下のように確認できます。

![スクリーンショット 2023-09-29 22.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/43fef838-45f5-fc7a-756d-290e4b4ce5ae.png)

このリポジトリでコードを公開しておりますので必要であればご覧ください。

https://github.com/takahashi123456/Qiita_Laravel