Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

筆者スキルは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

参考

b_a_a_d_o
怠惰で短気で傲慢なえんじにあ
https://www.gowest1.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした