前置き
前回は、Laravelの導入が完了しました。
参考書籍のサンプルではLaravelを入れて終わりではなく、MySQLによるデータベースも用意するので、今回はそれを行っていきます。
ちなみに、Windowsで環境構築を続けていたと仮定するとXAMPPのMariaDBをMySQLに切り替えていたのかもしれませんね。
手順
MariaDBの有無確認と削除
まずは、CentOSにおいてMariaDBが入っているかを確認します。そして入っているのであれば、削除する必要があります。
どうやらCenstOSにはMariaDBがすでに入っていることが多く、またMySQLと干渉する可能性もあるようですので。
確認
sudo yum list installed | grep mariadb
ようは、YUMリポジトリでインストール済みのリストを表示して、その中からmariadbがあるかを確認するコマンドですね。
存在していると以下のように表示が出ると思います。
削除
sudo systemctl stop mariadb.service
システムが起動しているかもしれないので、システム停止コマンドを入力します。
最初から止まっていても、特に問題ないのでコマンド入力しておくことをおすすめします。
sudo yum remove mariadb-*
そして、MariaDBを削除します。
removeの時は-yオプション(確認事項を全てyesで流すもの)は使わないほうがいいです。
削除後は、[確認]の項のコマンドでもう一度インストールリストを検索して何も表示されないことを確認しましょう。
MySQL関連パッケージの削除
MySQLが半端に入っていても邪魔なので、そちらもアンインストールします。
sudo yum remove mysql*
MySQLのインストール
MySQLもPHPのバージョン指定でやったみたいに、YUMリポジトリではない場所からインストールします。
具体的にはMySQLコミュニティからインストールします。
インストール
MySQL8.0のリポジトリをダウンロードします。
sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
念のため、リポジトリのリストを確認します。
yum repolist
MySQL本体のインストール前にGPGキーを更新しておきます。
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
MySQLをインストールします。クライアント側とサーバ側両方インストールされます。
sudo yum -y install mysql mysql-server
インストールされたかを確認します。
sudo yum list installed | grep mysql
初期設定
MySQLの設定を行っていきます。
まずは自動起動設定。
sudo systemctl enable mysqld
そして、手動スタート。
sudo systemctl start mysqld
初期パスワードを見に行きます。
sudo grep password /var/log/mysqld.log
試しにログインをして、パスワードに初期パスワードを入力して入れたらOK。
下記コマンドのように入れると、対話式でパスワードを聞かれる。後述のようにコマンドにパスワードを含めてもOK。
mysql -uroot -p
そして、データベースを触るには初期パスワードを変更する必要がある。パスワードは英大文字, 英小文字, 数字, 記号が入ったうえで8文字以上を求められる。
今回はLaravelのテスト用なので「Laravel_0001」とする例を示す。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Laravel_0001';
一度MySQLから出て、再ログインでパスワード変更を確認する。
mysqlから出るには以下。
exit;
設定したパスワードでのログインを試行。
mysql -uroot -p"Laravel_0001"
rootユーザでの新しいパスワードでのログインを確認しました。
Laravel接続用ユーザ作成
次に、そのままLaravelの接続用のユーザを作りましょう、
まず、現在のユーザ一覧を確認します。
ユーザ管理テーブルのあるデータベースを選択して、
USE mysql;
SELECT文を実行します。
SELECT user, host, plugin FROM user;
ユーザ作成SQLを実行します。検証用なので、rootユーザと同じパスワードです。
この際、後々LaravelのPDOからの接続で[The server requested authentication method unknown to the client]というエラーを回避するためにパスワードの設定をカスタムしています。
CREATE USER 'laravel'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Laravel_0001';
作成後に後から変更することも可能です。
ALTER user 'laravel'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Laravel_0001';
もう一度確認すると追加されていて、pluginの値も異なることが分かります。
次に、作成したユーザに権限を与えます。
今回は検証用なので全権限を与えますが、実用する場合はちゃんと設定しましょう。
GRANT ALL PRIVILEGES ON * . * TO 'laravel'@'localhost';
権限の更新はリロードが必要です。
FLUSH PRIVILEGES;
後述する接続検証用のデータベースとテーブル作成は、この時点で行っても構いません。
接続
環境変数
Laravelの環境変数にDBの情報を入れてしまって、接続の態勢を整える。
Laravelプロジェクトのルートディレクトリにある[.env]ファイルに環境変数が並んでいて、DBの情報を入力する項目もある。
前項で作成した[laravel]ユーザとパスワードを記述します。また、使うデータベースは後で作る「laravel_db」を指定。
データベース・テスト用テーブル作成
MySQLにrootユーザで入り、以下のSQLでデータベースを作成。
CREATE DATABASE laravel_db;
作成されたかどうかは下記SQLで確認可能。
SHOW DATABASES;
作成したデータベースを選択します。
USE laravel_db;
選択状態を確認。
SELECT DATABASE();
疎通テスト用のテーブルを作成します。
CREATE TABLE IF NOT EXISTS connection_test (id int AUTO_INCREMENT NOT NULL PRIMARY KEY, name varchar(15), age int);
テーブルにダミーデータをいくつか入れます。
INSERT INTO connection_test (name, age) VALUES ("wasabi", 30), ("mustard", 26), ("ginger", 20), ("red pepper", 5);
試しにSELECT文を入力。
SELECT * FROM connection_test;
良さそうです。
疎通確認
Laravel tinkerというデバッグツールを用いて疎通確認を行います。
mysqlのように対話式でコマンドを打てます。
PHP PDOのインストール
作業の前に、PHP PDOというデータベース間の接続を行ってくれるパッケージをPHPのバージョンに合わせてインストールします。
無い状態でDBに接続するコマンドを入力すると下記画像のように[Class ‘PDO’ not found]エラーが出ます。
sudo yum -y install --enablerepo=remi,remi-php72 php-pdo
PDOを入れたら、MySQLの拡張機能が入っているかチェックします。
php -m | grep pdo
入っていなければ、入れておきます。こいつが無いと[could not find driver]とかいうエラーが出てきます。
sudo yum -y install --enablerepo=remi,remi-php72 php-mysql
Apacheを再起動すると有効になります。
Tinker
下記コマンドでTinker内部に入ります。
php artisan tinker
小手調べにConfig確認。
config('database.connections.mysql');
そして、ConnectionのConfigを確認。PDOが入っていないとここで怒られます。
DB::connection()->getConfig();
更に、PDO情報も確認します。PDOのMySQL拡張機能や接続ユーザの設定(plugin方式など)が正しくないと、ここでエラーを貰います。設定したのにうまくいかない場合は、Apacheの再起動を忘れている可能性もあります。
DB::connection()->getPdo();
ついでにそれぞれの情報を見比べておきましょう。
最後にSELECT文を送って、作成したテーブルが表示されるかを確認して疎通確認OKとなります。
DB::select('SELECT * FROM connection_test');
最後に
MySQL繋ぐだけなのに、えらいハマりました。
書籍のサンプルアプリを試すには、まだ苦難がありそうです。