20200323のMySQLに関する記事は8件です。

忘備録:LAMP環境構築 

はじめに

自分用の忘備録として。

PHPの開発環境を自宅のpcで構築した時の手順を書いておきます。

環境

・mac Os Mojave
・CentOS 7.0
・Apache/2.4.6
・mysql 8.0.19
・PHP 7.3.15

VageantとVirtualBOXのインストール

・VirtualBOX
公式サイトよりインストール
https://www.virtualbox.org/ 

・vagrant
公式サイトよりdmgを取得しインストール
https://www.vagrantup.com/
*Vagrantを削除する際にdmgが必要になるらしいので念の為残しておく。

CentOS7

・boxの新規追加
box(仮想マシンのイメージファイル)をMacに新規追加。
https://app.vagrantup.com/centos/boxes/7

・centos/7の追加

$ vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://atlas.hashicorp.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop

VirtualBoxを使っているので3を選択

・BOXの確認

$ vagrant box list
centos/7 (virtualbox, 1905.1)
//今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ(MyVagrant)を作る
$ mkdir MyVagrant

//MyVagrantに移動する
$ cd MyVagrant

//仮想マシンを作るフォルダを作る(MyCentOS)
$ mkdir MyCentOS

//MyCentOSに移動する
$ cd MyCentOS

仮想マシン設定用のVagrantfileを作る
$ vagrant init centos/7

//Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする
$ sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

//仮想マシンを起動する(少し時間かかります)
$ vagrant up

//仮想マシンの状態を確認する
$ vagrant status

//OSを最新状態にアップデート
$ sudo yum -y update

//sshで接続
$ vagrant ssh

Apacheのインストール

$ yum install httpd

MySQLのインストール

$ yum localinstall http://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm

PHP7.3のインストール

PHPに関しては以下のサイトを参考。
https://www.rem-system.com/centos-httpd-php73/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xojo + MySQL(MariaDB) で日本語カラム名

日本語カラム名や日本語テーブル名を用いた MySQL(MariaDB) を Xojo で使うやり方。

環境

  • Ubuntu 18.04 AMD64
  • Xojo 2019 r3.1
  • (MySQL) 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

なお、MS-Windows でも同様にテストしたが、 Xojo に組み込まれている MySQL のドライバだと解決できない感じ。

接続

self.db = New MySQLCommunityServer
self.db.Host = "127.0.0.1"    // "localhost" ではNG
self.db.UserName = "xojodb"
self.db.Password = "password"
self.db.DatabaseName = "test"
Try
  self.db.Connect
  // proceed with database operations here..
Catch error As DatabaseException
  MessageBox("The database couldn't be opened. Error: " + error.Message)
  Return
End Try
try
  self.db.SQLExecute("set names utf8 collate utf8_general_ci")
  self.db.SQLExecute("set character set utf8")
  self.db.SQLExecute("use test")
Catch error as DatabaseException
  MessageBox error.Message
end try

set names utf8 collate utf8_general_ci

set character set utf8
を実行しておく必要がある。

試したSQL

この設定で、以下のSQLが正常に動作した。

INSERT文

app.db.ExecuteSQL("INSERT INTO sensorJP ( センサ,温度,湿度,memo) VALUES (2,"+temp+","+hemi+",'換気中');")

Select文

rsJP =app.db.SelectSQL("SELECT id,温度,湿度,memo FROM sensorJP")

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポートフォリオ

記事の概要

PHP,MySQLを使って作った掲示板アプリです。
レスポンシブ対応してあります。

作った背景

自分の母親がピアノ教室の先生をやっていて、生徒同士や先生と生徒が気軽に情報を交換したり、質問ができるようなものを作りたいと思ったからです。

機能

会員登録していなくても掲示板を見ることができ、会員登録することでメッセージを投稿できるようになるといった感じです。

会員登録

会員のお名前、メールアドレス、パスワードを入力します。
会員登録する際に、空欄があったり、既に登録されている会員だったり、パスワードが3文字以下だった場合は、エラーメッセージを表示するようにしました。
sampleapp.gif

ログイン機能

メールアドレスとパスワードでログインができるといったシステムです。
ログインでも空欄があったり、登録されていない場合などはエラーメッセージを表示します。
sampleapp2.gif

メッセージ送信機能

自由にメッセージを投稿することができます。
また、返信することもできます。
sampleapp3.gif

削除機能

自分が投稿したメッセージだけを削除できるようにしました。
sampleapp4.gif

ログアウト機能

ログアウトができます。
sampleapp5.gif

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Herokuへのデプロイ手順|Rails + MySQL

はじめに

MySQLで作成したRailsアプリを、Herokuを使ってデプロイすることがあったので備忘録としてまとめました。同じ環境で初めてデプロイする方の参考になれば幸いです。

自分の環境

  • macOS 10.15.3
  • DB: MySQL
  • Rails 5.0.7

Railsアプリケーションの作成

・アプリ作成 [現在作成中]

・Gemfile修正

sqlite3が入っている場合は、以下のようにしてproduction環境下で反映されないようにしましょう。

Gemfile.rb
group :development, :test do
  gem 'sqlite3', '~> 1.4'
end

下記mysql2を追加。

Gemfile.rb
  gem 'mysql2'

・config/environments/production.rbの設定

Heroku上の本番環境でHTMLにCSSやJavaScriptが反映されるように、以下の記述を書き換えます。

ターミナル
# デフォルトのfalseをtrueにします。
config.assets.compile = true

作成したRailsアプリをGit管理

Railsプロジェクトに移動します。(ディレクトリへのパスは自身の物へ置き換えてください)

ターミナル
$ cd rails/MyApp

以下を実行すると、RailsアプリがGit管理されます。

ターミナル
# リポジトリを新規作成。
$ git init

# 変更があったすべてのファイルがaddされる。
$ git add .

# ファイルの変更や追加などを保存。
$ git commit -m "<ここにコミットメッセージをいれる>"

Herokuアカウントの登録

https://jp.heroku.com/ にて登録。

Heroku CLIのインストール

Heroku CLIをインストールすると、ターミナル上でHerokuのコマンド操作ができるようになります。
https://devcenter.heroku.com/articles/heroku-cli
上記サイト、もしくは下記コマンドでインストールできます。

ターミナル
brew tap heroku/brew && brew install heroku

以下のコマンドで、インストールができているか確認します。

ターミナル
$heroku -v
>>heroku/7.0.47 darwin-x64 node-v10.1.0

SSH公開鍵の作成、Herokuへ追加

・SSH公開鍵の作成

まずは公開鍵が作成されているか確認しましょう。

ターミナル
cat ~/.ssh/id_rsa.pub

作成されてない場合は以下のように表示されます。

ターミナル
No such file or directory

それでは公開鍵を作成していきましょう。(実行ディレクトリはどこでも大丈夫です)

ターミナル
$ ssh-keygen
Generating public/private rsa key pair

# 鍵の保存先を聞かれます。変更する必要はないので、そのままEnterキーで進みます。
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa):

# 鍵のパスワードを設定するか聞かれます。
# 設定しない場合はそのままEnterを、設定する場合はパスワードを入力します。
Enter passphrase (empty for no passphrase):

# パスワードの確認をされます。同じパスワードを入力してください。
# 設定していない場合は空欄のままEnterキーで進みます。
Enter same passphrase again:

これで公開鍵が作成されました。確認しましょう。

ターミナル
cat ~/.ssh/id_rsa.pub

#このように文字列が表示されるはずです。
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== schacon@mylaptop.local

・Herokuに公開鍵を追加

Herokuにログインします。

ターミナル
$ heroku login

以下のコマンドでSSH公開鍵がHerokuに追加されます。

ターミナル
$ heroku keys:add ~/.ssh/id_rsa.pub

追加されたか確認しておきましょう。

ターミナル
$ heroku keys
# SSHキーの一部が表示されます。
ssh-rsa AAAA...BBBB

作成したRailsアプリとHerokuの紐付け

Railsプロジェクトに移動します。(ディレクトリへのパスは自身の物へ置き換えてください)

ターミナル
$ cd rails/MyApp

Herokuへ新しいアプリケーションを作成しましょう。

ターミナル
$ heroku apps:create <好きなアプリ名>

以下のように表示されたらアプリ名が既に使われちゃってます。
重複は許されないので他のアプリ名へ変更しましょう。

ターミナル
Name myapp is already taken

HerokuにDBを追加

・MySQLを追加

以下のコマンドで、clearDBというMysqlを使うためのアドオンがigniteプランで追加されます。

ターミナル
$ heroku addons:create cleardb:ignite

以下のような表示が出たら、クレジットカードの登録が必要です。

ターミナル
▸    Please verify your account to install this add-on plan (please enter a credit card) For more
▸    information, see https://devcenter.heroku.com/categories/billing Verify now at
▸    https://heroku.com/verify

*アドオンを追加するためにクレジットの登録が必要ですが、iginteプランは無料で使えます。

詳しいプラン内容については以下を参照。
https://elements.heroku.com/addons/cleardb

・Herokuアプリに環境変数を設定

以下のコマンドで、環境変数に入る値を取得します。

ターミナル
$ heroku config
=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true

Herokuアプリの環境変数に、上記で取得した値をそれぞれ設定。

ターミナル
$ heroku config:add DB_NAME='<データベース名>'

$ heroku config:add DB_USERNAME='<ユーザー名>'

$ heroku config:add DB_PASSWORD='<パスワード>'

$ heroku config:add DB_HOSTNAME='<ホスト名>'

$ heroku config:add DB_PORT='3306'

# gemで「mysql2」を使用しているので、mysql://ではなく「mysql2://」とします。
$ heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'

設定した値を確認しましょう。
以下のように表示されるはずです。

$ heroku config

=== <アプリの名前> Config Vars
CLEARDB_DATABASE_URL: mysql://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DATABASE_URL:         mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true
DB_HOSTNAME:          <ホスト名>
DB_NAME:              <データベース名>
DB_PASSWORD:          <パスワード>
DB_PORT:              3306
DB_USERNAME:          <ユーザー名>

Herokuにデプロイ

以下コマンドでローカルリポジトリをHerokuへpushすると、自動でデプロイが進んでいきます。

ターミナル
$ git push heroku master

*master以外のブランチをpushする場合は以下を実行

ターミナル
$ git push heroku <ブランチ名>:master

最後に以下のコマンドを入力して、データベースのマイグレーションをします。

ターミナル
$ heroku rake db:migrate

以下のコマンドを実行すると、ブラウザでアプリケーションにアクセスできます。

ターミナル
$ heroku open

お疲れ様でした!

参考サイト・記事

mysqlを使ったRailsアプリをHerokuにデプロイする流れ
Deploying with Git
SSH 公開鍵の作成

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

?【MySQL】外字を含むレコードのINSERT方法

やりたいこと

今時外字を扱うなんてと言われたらそうでもあるが扱う必要が出てきた場合
sqlファイルにてSQLを書いて実行することで外字の文字列をINSERTできる

やったこと

hogeデータベースにテストテーブルであるgaiji_test_tableを作成

create_table.sql
CREATE TABLE `gaiji_test_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `gaiji` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

?ファイルからSQLの実行

SQLファイルを作成し任意のディレクトリに格納
(今回は/test/test/gaiji.sql)

gaiji_insert.sql
INSERT INTO gaiji_test_table (gaiji) VALUES ('');

[root@localhost ~]# mysql hoge < /test/test/gaiji.sql 
mysql> select * from gaiji_test_table;
+----+-------+
| id | gaiji |
+----+-------+
|  1 |      |
+----+-------+
1 row in set (0.00 sec)

❌ターミナルでそのまま実行した場合

外字が消えてしまう

mysql> INSERT INTO gaiji_test_table (gaiji) VALUES ('');
Query OK, 1 row affected (0.02 sec)

mysql> select * from gaiji_test_table;
+----+-------+
| id | gaiji |
+----+-------+
|  1 |      |
|  2 |       |
+----+-------+
2 rows in set (0.00 sec)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel7.x】Migrationを用いてテーブルを作成。Seederを用いてデータを投入する

前提環境

Laravel7.x環境を構築。Welcomeページが表示された状態から開始。
その他、DBの設定等も済み。詳細は以下参照。

【準備編】https://qiita.com/katsuhito_01/items/db5b9581a2b6af6dc803
【導入編】https://qiita.com/katsuhito_01/items/439e3af4cea8ff00832c

Migrationを用いてテーブルを作成

まずはMigrationを用いて参照するテーブルを作成する。今回は都道府県マスタを作成。

Migration作成

Laravelプロジェクトのディレクトリ内にて、以下コマンドを実行

# php artisan make:migration create_mst_prefectures_table
Created Migration: 2020_03_22_163920_create_mst_prefectures_table

すると、database\migrations\日付_create_mst_prefectures_table.phpというファイルが作成される。
作成されたファイルをいじり、作成するテーブルの構造を記述する。
今回は以下のように記述。

【参考】:https://readouble.com/laravel/7.x/ja/migrations.html

database\migrations\日付_create_mst_prefectures_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMstPrefecturesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('mst_prefectures', function (Blueprint $table) {
            $table->integer('id')->primary();
            $table->string('name', 10);
            $table->string('name_kana', 10);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('mst_prefectures');
    }
}

Migration実行

構造を記述したら、Migrationを実行。

# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Migrating: 2020_03_22_163920_create_mst_prefectures_table
Migrated:  2020_03_22_163920_create_mst_prefectures_table (0.01 seconds)

MySQLに入り、テーブルを確認。

mysql> show tables;
+-----------------------+
| Tables_in_mypage01_db |
+-----------------------+
| failed_jobs           |
| migrations            |
| mst_prefectures       |
| users                 |
+-----------------------+
4 rows in set (0.00 sec)

mysql> desc mst_prefectures;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(10) | NO   |     | NULL    |       |
| name_kana  | varchar(10) | NO   |     | NULL    |       |
| created_at | timestamp   | YES  |     | NULL    |       |
| updated_at | timestamp   | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

出来てますね!

Seederを用いてテーブルにデータを投入

市区町村マスタができたので、Seederを用いてデータを投入する。

Modelを作成する

まずはModelを作成。
以下実行で、app直下にModelが作成される。
とりあえず今は何も書かない。

php artisan make:model MstPrefecture

ちなみに作成されたModelの中身を見てみると、空のクラスがあるだけ。
テーブルとの紐づけを明示する記述がどこにもない。

app\MstPrefecture.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MstPrefecture extends Model
{
    //
}

以下、公式ドキュメントの記述。

他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。

【引用元】https://readouble.com/laravel/5.7/ja/eloquent.html

今回でいうと、「MstPrefectur」を「mst_prefectures」と自動的に結び付けてつけてくれる。
「おせっかいだ」と思った方は、Modelのクラス内に以下記述を追加することで、Modelとテーブルを明示的に紐づけることができる。

app\MstPrefecture.php
protected $table = 'テーブル名';

Seeder作成

続いてSeederを作成。

# php artisan make:seeder MstPrefecturesSeeder
Seeder created successfully.

以下のファイルが作成される。
database\seeds\MstPrefecturesSeeder.php

早速中身をいじり、投入するデータを記述する。

database\seeds\MstPrefecturesSeeder.php
<?php

use Illuminate\Database\Seeder;
use App\MstPrefecture;

class MstPrefecturesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        MstPrefecture::insert([
            ['id' =>  1, 'name' => '北海道', 'name_kana' => 'ホッカイドウ', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  2, 'name' => '青森県', 'name_kana' => 'アオモリケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  3, 'name' => '岩手県', 'name_kana' => 'イワテケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  4, 'name' => '宮城県', 'name_kana' => 'ミヤギケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  5, 'name' => '秋田県', 'name_kana' => 'アキタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  6, 'name' => '山形県', 'name_kana' => 'ヤマガタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  7, 'name' => '福島県', 'name_kana' => 'フクシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  8, 'name' => '茨城県', 'name_kana' => 'イバラキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  9, 'name' => '栃木県', 'name_kana' => 'トチギケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 10, 'name' => '群馬県', 'name_kana' => 'グンマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 11, 'name' => '埼玉県', 'name_kana' => 'サイタマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 12, 'name' => '千葉県', 'name_kana' => 'チバケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 13, 'name' => '東京都', 'name_kana' => 'トウキョウト', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 14, 'name' => '神奈川県', 'name_kana' => 'カナガワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 15, 'name' => '新潟県', 'name_kana' => 'ニイガタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 16, 'name' => '富山県', 'name_kana' => 'トヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 17, 'name' => '石川県', 'name_kana' => 'イシカワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 18, 'name' => '福井県', 'name_kana' => 'フクイケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 19, 'name' => '山梨県', 'name_kana' => 'ヤマナシケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 20, 'name' => '長野県', 'name_kana' => 'ナガノケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 21, 'name' => '岐阜県', 'name_kana' => 'ギフケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 22, 'name' => '静岡県', 'name_kana' => 'シズオカケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 23, 'name' => '愛知県', 'name_kana' => 'アイチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 24, 'name' => '三重県', 'name_kana' => 'ミエケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 25, 'name' => '滋賀県', 'name_kana' => 'シガケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 26, 'name' => '京都府', 'name_kana' => 'キョウトフ', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 27, 'name' => '大阪府', 'name_kana' => 'オオサカフ', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 28, 'name' => '兵庫県', 'name_kana' => 'ヒョウゴケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 29, 'name' => '奈良県', 'name_kana' => 'ナラケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 30, 'name' => '和歌山県', 'name_kana' => 'ワカヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 31, 'name' => '鳥取県', 'name_kana' => 'トットリケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 32, 'name' => '島根県', 'name_kana' => 'シマネケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 33, 'name' => '岡山県', 'name_kana' => 'オカヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 34, 'name' => '広島県', 'name_kana' => 'ヒロシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 35, 'name' => '山口県', 'name_kana' => 'ヤマグチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 36, 'name' => '徳島県', 'name_kana' => 'トクシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 37, 'name' => '香川県', 'name_kana' => 'カガワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 38, 'name' => '愛媛県', 'name_kana' => 'エヒメケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 39, 'name' => '高知県', 'name_kana' => 'コウチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 40, 'name' => '福岡県', 'name_kana' => 'フクオカケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 41, 'name' => '佐賀県', 'name_kana' => 'サガケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 42, 'name' => '長崎県', 'name_kana' => 'ナガサキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 43, 'name' => '熊本県', 'name_kana' => 'クマモトケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 44, 'name' => '大分県', 'name_kana' => 'オオイタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 45, 'name' => '宮崎県', 'name_kana' => 'ミヤザキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 46, 'name' => '鹿児島県', 'name_kana' => 'カゴシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 47, 'name' => '沖縄県', 'name_kana' => 'オキナワケン', 'created_at' => now(), 'updated_at' => now()]
        ]);
    }
}

実行するSeederに追加

投入するデータの記述ができたら、以下を編集。
実行するSeederとして追加しておく。
database\seeds\DatabaseSeeder.php

database\seeds\DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(MstPrefecturesSeeder::class);
    }
}

Seederを実行

まずはComposerオートローダを再作成。
基本的に新しいクラスを追加したときは、このコマンドを実行しておく

# composer dump-autoload
Package manifest generated successfully.
Generated optimized autoload files containing 4098 classes

そしてSeederを実行。

# php artisan db:seed
Seeding: MstPrefecturesSeeder
Seeded:  MstPrefecturesSeeder (0.06 seconds)
Database seeding completed successfully.

MySQLよりテーブルを見てみると…

mysql> select * from mst_prefectures order by id;
+----+--------------+--------------------+---------------------+---------------------+
| id | name         | name_kana          | created_at          | updated_at          |
+----+--------------+--------------------+---------------------+---------------------+
|  1 | 北海道       | ホッカイドウ       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  2 | 青森県       | アオモリケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  3 | 岩手県       | イワテケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  4 | 宮城県       | ミヤギケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  5 | 秋田県       | アキタケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  6 | 山形県       | ヤマガタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  7 | 福島県       | フクシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  8 | 茨城県       | イバラキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  9 | 栃木県       | トチギケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 10 | 群馬県       | グンマケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 11 | 埼玉県       | サイタマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 12 | 千葉県       | チバケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 13 | 東京都       | トウキョウト       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 14 | 神奈川県     | カナガワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 15 | 新潟県       | ニイガタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 16 | 富山県       | トヤマケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 17 | 石川県       | イシカワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 18 | 福井県       | フクイケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 19 | 山梨県       | ヤマナシケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 20 | 長野県       | ナガノケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 21 | 岐阜県       | ギフケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 22 | 静岡県       | シズオカケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 23 | 愛知県       | アイチケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 24 | 三重県       | ミエケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 25 | 滋賀県       | シガケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 26 | 京都府       | キョウトフ         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 27 | 大阪府       | オオサカフ         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 28 | 兵庫県       | ヒョウゴケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 29 | 奈良県       | ナラケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 30 | 和歌山県     | ワカヤマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 31 | 鳥取県       | トットリケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 32 | 島根県       | シマネケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 33 | 岡山県       | オカヤマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 34 | 広島県       | ヒロシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 35 | 山口県       | ヤマグチケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 36 | 徳島県       | トクシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 37 | 香川県       | カガワケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 38 | 愛媛県       | エヒメケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 39 | 高知県       | コウチケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 40 | 福岡県       | フクオカケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 41 | 佐賀県       | サガケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 42 | 長崎県       | ナガサキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 43 | 熊本県       | クマモトケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 44 | 大分県       | オオイタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 45 | 宮崎県       | ミヤザキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 46 | 鹿児島県     | カゴシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 47 | 沖縄県       | オキナワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
+----+--------------+--------------------+---------------------+---------------------+
47 rows in set (0.00 sec)

入ってますね!
今回はDatabaseSeeder記述のSeederをすべて実行する形でしたが、以下のように個別に実行することも可能。

php artisan db:seed --class=MstPrefecturesSeeder

次回から、CRUDを作っていきましょうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel7.2】Migrationを用いてテーブルを作成。Seederを用いてデータを投入する

前提環境

Laravel7.2環境を構築。Welcome!画面が表示された状態から開始。
その他、DBの設定等も済み。詳細は以下参照。

【準備編】https://qiita.com/katsuhito_01/items/db5b9581a2b6af6dc803
【導入編】https://qiita.com/katsuhito_01/items/439e3af4cea8ff00832c

Migrationを用いてテーブルを作成

まずはMigrationを用いて参照するテーブルを作成する。今回は都道府県マスタを作成。

Migration作成

Laravelプロジェクトのディレクトリ内にて、以下コマンドを実行

# php artisan make:migration create_mst_prefectures_table
Created Migration: 2020_03_22_163920_create_mst_prefectures_table

すると、database\migrations\日付_create_mst_prefectures_table.phpというファイルが作成される。
作成されたファイルをいじり、作成するテーブルの構造を記述する。
今回は以下のように記述。

【参考】:https://readouble.com/laravel/7.x/ja/migrations.html

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMstPrefecturesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('mst_prefectures', function (Blueprint $table) {
            $table->integer('id')->primary();
            $table->string('name', 10);
            $table->string('name_kana', 10);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('mst_prefectures');
    }
}

Migration実行

構造を記述したら、Migrationを実行。

# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Migrating: 2020_03_22_163920_create_mst_prefectures_table
Migrated:  2020_03_22_163920_create_mst_prefectures_table (0.01 seconds)

MySQLに入り、テーブルを確認。

mysql> show tables;
+-----------------------+
| Tables_in_mypage01_db |
+-----------------------+
| failed_jobs           |
| migrations            |
| mst_prefectures       |
| users                 |
+-----------------------+
4 rows in set (0.00 sec)

mysql> desc mst_prefectures;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id         | int(11)     | NO   | PRI | NULL    |       |
| name       | varchar(10) | NO   |     | NULL    |       |
| name_kana  | varchar(10) | NO   |     | NULL    |       |
| created_at | timestamp   | YES  |     | NULL    |       |
| updated_at | timestamp   | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

出来てますね!

Seederを用いてテーブルにデータを投入

市区町村マスタができたので、Seederを用いてデータを投入する。

Modelを作成する

まずはModelを作成。
以下実行で、app直下にModelが作成される。
とりあえず今は何も書かない。

php artisan make:model MstPrefecture

ちなみに作成されたModelの中身を見てみると、空のクラスがあるだけ。
テーブルとの紐づけを明示する記述がどこにもない。

明示的に設定することもできるが、公式ドキュメントには以下の記述がある。

他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。

【引用元】https://readouble.com/laravel/5.7/ja/eloquent.html

今回でいうと、「MstPrefectur」を「mst_prefectures」と自動的に結び付けてつけてくれる。
逆を言うと、テーブル名を決める際はLaravelの命名規則に則っていないと、こういった恩恵が受けられない。
「おせっかいだ」と思った方は、Modelのクラス内に以下記述を追加することで、Modelとテーブルを明示的に紐づけることができる。

protected $table = 'テーブル名';

Seeder作成

続いてSeederを作成。

# php artisan make:seeder MstPrefecturesSeeder
Seeder created successfully.

以下のファイルが作成される。
database\seeds\MstPrefecturesSeeder.php

早速中身をいじり、投入するデータを記述する。

<?php

use Illuminate\Database\Seeder;
use App\MstPrefecture;

class MstPrefecturesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        MstPrefecture::insert([
            ['id' =>  1, 'name' => '北海道', 'name_kana' => 'ホッカイドウ', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  2, 'name' => '青森県', 'name_kana' => 'アオモリケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  3, 'name' => '岩手県', 'name_kana' => 'イワテケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  4, 'name' => '宮城県', 'name_kana' => 'ミヤギケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  5, 'name' => '秋田県', 'name_kana' => 'アキタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  6, 'name' => '山形県', 'name_kana' => 'ヤマガタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  7, 'name' => '福島県', 'name_kana' => 'フクシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  8, 'name' => '茨城県', 'name_kana' => 'イバラキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' =>  9, 'name' => '栃木県', 'name_kana' => 'トチギケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 10, 'name' => '群馬県', 'name_kana' => 'グンマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 11, 'name' => '埼玉県', 'name_kana' => 'サイタマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 12, 'name' => '千葉県', 'name_kana' => 'チバケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 13, 'name' => '東京都', 'name_kana' => 'トウキョウト', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 14, 'name' => '神奈川県', 'name_kana' => 'カナガワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 15, 'name' => '新潟県', 'name_kana' => 'ニイガタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 16, 'name' => '富山県', 'name_kana' => 'トヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 17, 'name' => '石川県', 'name_kana' => 'イシカワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 18, 'name' => '福井県', 'name_kana' => 'フクイケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 19, 'name' => '山梨県', 'name_kana' => 'ヤマナシケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 20, 'name' => '長野県', 'name_kana' => 'ナガノケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 21, 'name' => '岐阜県', 'name_kana' => 'ギフケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 22, 'name' => '静岡県', 'name_kana' => 'シズオカケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 23, 'name' => '愛知県', 'name_kana' => 'アイチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 24, 'name' => '三重県', 'name_kana' => 'ミエケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 25, 'name' => '滋賀県', 'name_kana' => 'シガケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 26, 'name' => '京都府', 'name_kana' => 'キョウトフ', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 27, 'name' => '大阪府', 'name_kana' => 'オオサカフ', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 28, 'name' => '兵庫県', 'name_kana' => 'ヒョウゴケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 29, 'name' => '奈良県', 'name_kana' => 'ナラケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 30, 'name' => '和歌山県', 'name_kana' => 'ワカヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 31, 'name' => '鳥取県', 'name_kana' => 'トットリケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 32, 'name' => '島根県', 'name_kana' => 'シマネケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 33, 'name' => '岡山県', 'name_kana' => 'オカヤマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 34, 'name' => '広島県', 'name_kana' => 'ヒロシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 35, 'name' => '山口県', 'name_kana' => 'ヤマグチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 36, 'name' => '徳島県', 'name_kana' => 'トクシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 37, 'name' => '香川県', 'name_kana' => 'カガワケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 38, 'name' => '愛媛県', 'name_kana' => 'エヒメケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 39, 'name' => '高知県', 'name_kana' => 'コウチケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 40, 'name' => '福岡県', 'name_kana' => 'フクオカケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 41, 'name' => '佐賀県', 'name_kana' => 'サガケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 42, 'name' => '長崎県', 'name_kana' => 'ナガサキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 43, 'name' => '熊本県', 'name_kana' => 'クマモトケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 44, 'name' => '大分県', 'name_kana' => 'オオイタケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 45, 'name' => '宮崎県', 'name_kana' => 'ミヤザキケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 46, 'name' => '鹿児島県', 'name_kana' => 'カゴシマケン', 'created_at' => now(), 'updated_at' => now()],
            ['id' => 47, 'name' => '沖縄県', 'name_kana' => 'オキナワケン', 'created_at' => now(), 'updated_at' => now()]
        ]);
    }
}

実行するSeederに追加

投入するデータの記述ができたら、以下を編集。
実行するSeederとして追加しておく。
database\seeds\DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(MstPrefecturesSeeder::class);
    }
}

Seederを実行

まずはComposerオートローダを再作成。
基本的に新しいクラスを追加したときは、このコマンドを実行しておく

# composer dump-autoload
Package manifest generated successfully.
Generated optimized autoload files containing 4098 classes

そしてSeederを実行。

# php artisan db:seed
Seeding: MstPrefecturesSeeder
Seeded:  MstPrefecturesSeeder (0.06 seconds)
Database seeding completed successfully.

MySQLよりテーブルを見てみると…

mysql> select * from mst_prefectures order by id;
+----+--------------+--------------------+---------------------+---------------------+
| id | name         | name_kana          | created_at          | updated_at          |
+----+--------------+--------------------+---------------------+---------------------+
|  1 | 北海道       | ホッカイドウ       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  2 | 青森県       | アオモリケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  3 | 岩手県       | イワテケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  4 | 宮城県       | ミヤギケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  5 | 秋田県       | アキタケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  6 | 山形県       | ヤマガタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  7 | 福島県       | フクシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  8 | 茨城県       | イバラキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
|  9 | 栃木県       | トチギケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 10 | 群馬県       | グンマケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 11 | 埼玉県       | サイタマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 12 | 千葉県       | チバケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 13 | 東京都       | トウキョウト       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 14 | 神奈川県     | カナガワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 15 | 新潟県       | ニイガタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 16 | 富山県       | トヤマケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 17 | 石川県       | イシカワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 18 | 福井県       | フクイケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 19 | 山梨県       | ヤマナシケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 20 | 長野県       | ナガノケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 21 | 岐阜県       | ギフケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 22 | 静岡県       | シズオカケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 23 | 愛知県       | アイチケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 24 | 三重県       | ミエケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 25 | 滋賀県       | シガケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 26 | 京都府       | キョウトフ         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 27 | 大阪府       | オオサカフ         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 28 | 兵庫県       | ヒョウゴケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 29 | 奈良県       | ナラケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 30 | 和歌山県     | ワカヤマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 31 | 鳥取県       | トットリケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 32 | 島根県       | シマネケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 33 | 岡山県       | オカヤマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 34 | 広島県       | ヒロシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 35 | 山口県       | ヤマグチケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 36 | 徳島県       | トクシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 37 | 香川県       | カガワケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 38 | 愛媛県       | エヒメケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 39 | 高知県       | コウチケン         | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 40 | 福岡県       | フクオカケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 41 | 佐賀県       | サガケン           | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 42 | 長崎県       | ナガサキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 43 | 熊本県       | クマモトケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 44 | 大分県       | オオイタケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 45 | 宮崎県       | ミヤザキケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 46 | 鹿児島県     | カゴシマケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
| 47 | 沖縄県       | オキナワケン       | 2020-03-23 03:17:52 | 2020-03-23 03:17:52 |
+----+--------------+--------------------+---------------------+---------------------+
47 rows in set (0.00 sec)

入ってますね!
今回はDatabaseSeeder記述のSeederをすべて実行する形でしたが、以下のように個別に実行することも可能。

php artisan db:seed --class=MstPrefecturesSeeder

次回から、CRUDを作っていきましょうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Codeigniter3のローカル環境をMAMPからDockerへ移した話

タイトルの通りですが、その際色々とつまづいたのでこちらに学習メモとして残しておきます。

最初に筆者のスペックを簡単に

・CodeigniterもPHPも初級者
・MAMP歴1週間、Docker利用は今回が初めて
・Qiita初投稿

てな状況でQiitaに投稿するなんて無謀かなーとは思いましたが、アウトプットの一環ということで?
流れを再現しつつ解決方法を書いていきます。

使用したものとバージョン

  • PHP 7.4
  • Codeigniter 3.1.6
  • Apache
  • Mysql 5.7

PHP、Apache、MysqlはMAMPの環境をそのまま持って行きたかったので特に選んだ理由はなし。
Codeigniterはcomposerを使ってインストールしたものになります。

ディレクトリ構造

codeigniter
├──application
├──bin
├──public
│   └──index.php
├──vendor
├──docker-compose.yml
└──php.ini
docker-compose.yml
version: '3'

services:
  php:
    container_name: CI-TL-L
    image: php:7.4-apache
    depends_on:
      - mysql
    volumes:
      - ./:/var/www/html/codeigniter
    working_dir: /var/www/html
    ports:
      - 8080:80
    restart: always
  mysql:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=「パスワード名」
      - MYSQL_DATABASE=「データベース名」
      - MYSQL_USER=「ユーザー名」
      - MYSQL_PASSWORD=「パスワード」
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions
php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

コンテナ起動 1

この時点で一度コンテナを起動してみると...

codeigniter$ docker-compose up -d
An uncaught Exception was encountered
Type: Error
Message: Call to undefined function mysqli_init()
Filename: /var/www/html/codeigniter/vendor/codeigniter/framework/system/database/drivers/mysqli/mysqli_driver.php
Line Number: 135
Backtrace:
    File: /var/www/html/codeigniter/public/index.php
    
Line: 315

    Function: require_once

「定義されていないmysqli_init()が呼び出されています」というエラーが出ます。

コンテナ起動 1 解決方法

このエラーは指定したドライバーのmysqliがインストールされていないことに起因します。
解決するには
1.php-apache用のDockerfileを作成して
2.docker-compose.ymlを編集して上記のDockerfileでコンテナを起動します。

codeigniter
├──application
├──bin
├──public
│   └──index.php
├──vendor
├──docker-compose.yml
├──Dockerfile ---------追加
└──php.ini
Dockerfile
FROM php:7.4-apache

RUN apt-get update \
    && docker-php-ext-install mysqli
docker-compose.yml
version: '3'

services:
  php:
    container_name: CI-TL-L
    build: ./Dockerfile -------編集
    depends_on:
      - mysql
    volumes:
    .
    .
    .

これで先ほどのエラーは解消されたはずです。

コンテナ起動 2

ここでコンテナを再起動してみると...

codeigniter$ docker-compose down
codeigniter$ docker-compose up -d
エラー
Message: mysqli::real_connect(): (HY000/2002): No such file or directory
Filename: mysqli/mysqli_driver.php
Line Number: 203

また別のエラーが出ました。
mysqliのエラーのようなので「mysqliはインストールしたはずなのに...」とこのエラーで2日ほど潰されました。

コンテナ起動 2 解決方法

では実際mysqliに問題があったかというと実はそうではありません。
このエラーはdatabase.phpを編集することで解消できます。
ディレクトリパスはapplication>config>database.phpですね。

database.php
db['default'] = array(
    'dsn'   => '',
    'hostname' => 'mysql', -----編集
    'username' => 'ユーザー名',
    'password' => 'パスワード',
    'database' => 'データベース名',
    'dbdriver' => 'mysqli',

これで先ほどのエラーは解消できました。

詳しいことは分かりませんが、コンテナ間の通信ではdocker-compose.ymlで指定したサービス名でホスト名を指定する必要があるそうです。
今回の場合だと、docker-compose.ymlでmysqlコンテナにmysqlというサービス名を付けたのでこのような記述になるというわけですね。

コンテナ起動 3

そして、今度こそ3度目の正直ということで祈りながら起動...

terminal
codeigniter$ docker-compose down
codeigniter$ docker-compose up -d



エラー
A PHP Error was encountered
mkdir() invalid path
drivers/Session_file_driver.php
Line number: 136

はい、出ました。エラーです。
ここまできたらサクッと解決しちゃいましょう。

コンテナ起動 3 解決方法

解決するにはconfig.phpの編集が必要になります。

config.php
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = BASEPATH.'sessions'; -------編集
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

正直このエラーはなぜエラーが出たのか、なぜこれで解消できたのか、分かりませんでした。すみません。

ということでエラー解消までの流れは以上になります。

余談

当初はローカル環境を移すだけでここまで苦労するとは思いませんでした。
検索しながら解決方法を模索しているときは真っ暗な迷路を進んでいるようで、「この道は合っているのか」「この先にゴールは本当にあるのか」と本当に辛かったと記憶しています。

しかし、終わった後に振り返ってみるとゴールすることだけが全てではないと分かりました。
エラーを解決するために右往左往するうちにDockerの使い方を覚えてCodeigniterの知識をも深めることができたからです。

この記事が僕と同じような初級プログラマーの精神的助けになれたら嬉しい限りです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む