25
13

More than 5 years have passed since last update.

LaravelからMySQLのデータをいじってみた

Last updated at Posted at 2018-07-04

筆者スキルはLaravel素人。
主にある程度慣れているRuby on Railsと比較しながら進める。

環境

PHP 7.1.16
Laravel 5.6.26

初期設定

MySQLへのデータベース接続設定をする。
初期のままだとズレている模様。
下記の箇所をMySQLの設定に合わせて適宜編集する。
エンジンは指定しない場合はInnoDBとなるようで、nullのままで良さそう。

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=
config/database.php
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'homestead'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

Railsのdb:createのようなデータベースを作成するコマンドは無いので、データベースはMySQLのコマンドラインから作成する。

mysql -uroot -p
CREATE DATABASE `homestead` DEFAULT CHARACTER SET = `utf8mb4`;

モデル生成

バグ一覧のためのモデル等の雛形を一式出力してみる。
make:modelはRailsのgenerate modelとだいたい同じだが、本当にモデルしか作らない。
Railsのように初期の列は指定はできない。
モデル名はRailsのようにうまい具合に大文字小文字や複数形を解釈してくれないので、作って欲しいモデル名をちゃんと指定する。
例えばhogeと指定したら(Hogeではなく)hogeモデルができ、hogesと指定したら(Hogeではなく)hogesモデルができる。
-aがだいたいRailsのgenerate scaffold相当で、モデルの他にコントローラ、マイグレーション、ファクトリーを生成してくれる。

php artisan make:model -a Bug

ただし本当に枠の作成のみで中身が無く、ルーティングもされていないので、このままhttp://localhost:8000/bugsにアクセスしても何もできない。

個別にコントローラ(-c)、マイグレーション(-m)、ファクトリー(-f)を生成するオプションもあるが、あまり出番は無さそう。

次に生成されたマイグレーションを編集する。

database/migrations/2018_07_04_025522_create_bugs_table.php
        Schema::create('bugs', function (Blueprint $table) {
            $table->bigIncrements('bug_id');
            $table->date('date_reported');
            $table->string('summary', 80)->nullable();
            $table->string('description', 1000)->nullable();
            $table->string('resolution', 1000)->nullable();
            $table->string('status', 20)->default('NEW');
            $table->string('priority', 20)->nullable();
            $table->decimal('hours', 9, 2)->nullable();
            $table->timestamps();
        });

下敷きにしたテーブルのDDLは以下の通り。

CREATE TABLE Bugs (
  bug_id SERIAL     PRIMARY KEY,
  date_reported     DATE NOT NULL,
  summary           VARCHAR(80),
  description       VARCHAR(1000),
  resolution        VARCHAR(1000),
  status            VARCHAR(20) NOT NULL DEFAULT 'NEW',
  priority          VARCHAR(20),
  hours             NUMERIC(9,2)
);

マイグレーション実行

マイグレーションを流そうとすると以下のようなエラーが出るので、あらかじめ対処しておく。

Specified key was too long; max key length is 767 bytes
alter table `users` add unique `users_email_unique`(`email`)
app/Providers/AppServiceProvider.php
:
use Illuminate\Support\Facades\Schema;
:
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
:

その後、マイグレーションを実行。

php artisan migrate

データを操作してみる

rails consoleに相当するコンソールを起動する。

php artisan tinker

コンソールから適当にデータを操作してみる。

DB::table('bugs')->insert(
    ['date_reported' => '2018-05-06', 'summary' => '🍺', 'description' => '😃', 'resolution' => '😂', 'status' => '👌', 'priority' => '⏬', 'hours' => 1.2]
)
DB::table('bugs')->where('bug_id', 1)->update(['hours' => 1.5])
DB::table('bugs')->where('bug_id', 1)->first()
# => {#2881
#      +"bug_id": 1,
#      +"date_reported": "2018-05-06",
#      +"summary": "🍺",
#      +"description": "😃",
#      +"resolution": "😂",
#      +"status": "👌",
#      +"priority": "⏬",
#      +"hours": "1.50",
#      +"created_at": null,
#      +"updated_at": null,
#    }

データベース上でもデータが入っている事が確認できた。

スクリーンショット 2018-07-04 18.24.07.png

参考

25
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
13