Laravelにmysqlを設定してテーブルを作成・取得してみた!超初心者のLaravelの勉強

2020-05-02

いろいろ苦戦しましたがphpbrewを使ってMySQLをインストールするところまではきたけれど、LaravelとMySQLの接続方法がわからないので調べてみました。

苦戦した時の記事。phpbrewのインストール手順も載っているのでMacユーザでMySQLインストールまだの方は参考まで。

LaravelをやMySQLをとりあえずインストールできたけど、この先どうしたらいいんだろうという方向けに書いています。
ネット上にはいきなりレベルが高い記事や、それでこの後どうしたらいいのというような記事が多く挫折しかかったのでそうならないように、なんとなく手順通りに実施していけばLaravelとデータベースつながることを目標に書いていきます。

思ってたよりやることたくさんあった。

Laravelにmysqlを設定

動作環境

ざっくりMac El capitan
mysql@5.6
ローカル環境です。

MySQLの準備 (データベースの作成・ユーザ作成)

インストールしパスを通したただけなので、設定を行います。

mysql -u root

rootユーザでMySQLに入ります。

create database 名前;

データベースを作成します。名前は任意で好きな名前をつけます。ここではlaraveldbにしました。

grant all on laraveldb.* to user1@localhost identified by 'pass';

ユーザを作成し、そのユーザに全ての権限(GRANT ALL)を与えています。

ぱっと見難しかったので構文の書き方も調べました。

GRANT ALL ON データベース名.* TO ユーザ名@ホスト名 identified by 'パスワード';

設定が終了したのでMySQLから抜けます。

\q

不安な方はDBとユーザがうまく作られてるか確認してみてください。
(私はタイプミスしてました。)

Laravelの設定 .env

.envファイルを編集します。9行目あたりにあるコードを抜粋。

■ 修正前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

■ 修正場所

MySQLで作成したデータベース名とユーザ名、パスワードをいれます。
※ DB_HOSTなどはローカル環境でない場合は環境に合わせてください。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザ名
DB_PASSWORD=パスワード

■ 修正後

MySQLの設定に合わせて変更しました。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=user1
DB_PASSWORD=pass

Laravelの設定
マイグレーションを準備 (既存流用テーブルの作成編)

ユーザ用(テーブル名:users)のマイグレーションを準備します。
既存のファイルに言語(日本語/英語)のカラムを追加してみます。
※太字が追加箇所

ファイルパス:database/migrations/2014_10_12_000000_create_users_table.php

     public function up()
    {
        Schema::create('users', function (Blueprint $table) {
        $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
$table->string('lang')->default('ja');
            $table->rememberToken();
            $table->timestamps();
        });
    }

Laravelの設定
マイグレーションを作成 (新規テーブルの作成編)

マイグレーションを作成します。

Artisanコマンドを使用します。

php artisan make:migration テーブル名(以下 tableName)

作成したファイルを修正します。

■ 修正前

ファイルのパス : database/migrations/tableName.php

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

■ 修正後

カラムに当たる場所なので好きに設定。以下は例。

    public function up()
    {
        Schema::create('tableName', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();

        });
    }

Laravelの設定
モデルを作成する(新規作成テーブル用)

php artisan make:model モデル名(以下ModelName)

作成したモデルを修正する。

■ 修正前

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ModelName extends Model
{
//
}

■ 修正後

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ModelName extends Model
{
//参照させたいテーブル名を指定
protected $table = 'laraveldb';

}

MySQLのバージョンが5.7.7未満なら

MySQLのバージョンが5.7.7未満ならvarchar型の文字数を191に制限する必要があるそうです。
※ MariaDB10.2.2未満含む

太字が追加箇所です。

ファイルのパス : app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
}

Laravelの設定
マイグレーションの実施

以下コマンドで準備したテーブルをMySQLに作成します。

php artisan migrate

作成されたら以下コマンドを実施。

$ php artisan tinker
// 既存テーブルの確認
>>> DB::table('users')->get();
// 新規作成したテーブルの確認
>>> DB::table('tableName')->get();

まだデータが入っていないので、以下のように表示されればOK。

=> Illuminate\Support\Collection {#3013
     all: [],
   }

ここまでできたらもうデータベースとのやりとりに成功しています。

ちなみに私は以下のようなエラーに遭遇しています。

こちらはドライバーがないといわれてしまいまいた。

こちらは上で記述したMySQLのバージョンが5.7.7未満ならの設定が保存されておらず、発生しました。

テーブルへデータをインサート

せっかくなので、新規作成したテーブルへデータをインサートします。

>>> DB::table('tableName')->insert(['id' => '001', "title" => 'test', "body" => 'tesybody'])

再度、テーブルを取得。

// 新規作成したテーブルの確認
>>> DB::table('tableName')->get();

■ 返答

=> Illuminate\Support\Collection {#3022
     all: [
       {#3027
         +"id": 1,
         +"title": "test",
         +"body": "tesybody",
         +"created_at": null,
         +"updated_at": null,
       },
     ],
   }

おー。ほんの少しだけLaravelの仕組みがわかってきました。

参考サイト: Laravel5.7: DBとしてMySQLを用意する| Qitta
参考サイト: Laravelで「Base table or view not found: 1146 Table」エラーが出るときの対処法|Qitta

laravel, MySQL, php, SQL

Posted by Nakamoto