はじめに
MySQLで作成したビューをLaravelに取り込む方法についてメモ感覚で。
- MySQLで作成したビューのモデルを作成する。
- ORM(Eloquent)を用いてレコードを取得する。
開発環境
・Laravel 7.30.4
・MySQL 5.7.32
プロジェクト作成
テキトーにプロジェクトを作成します。
composer create-project --prefer-dist "laravel/laravel=7.*.*" hoge_app
.envファイルの変更
DBの設定を行います。
使用するDB名はテキトーに作ってください。
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=world
DB_USERNAME=##########
DB_PASSWORD=##########
.envファイルの設定が終わったらプロジェクトのディレクトリに移動して、下記コマンドを実行してください。
php artisan config:cache
これを実行しないと変更内容が反映されないので必ずするように…
疎通確認(マイグレーションの実行)
下記のコマンドを実行して.envで指定したDB上にテーブルが作成出来ていれば、疎通確認はOKです。
php artisan migrate
失敗したらユーザ名やパスワードが間違っている可能性があるので再度ご確認を…
モデルの作成
私は「v_countryinformation」というビューを作成しました。
ちなみにレコードはこんな感じです。
ビューの作成が終わったら、モデル作成を行うコマンドを実行します。
下記のコマンド実行後、Appディレクトリに「モデル名.php」というファイル(今回はCountryInfo.php)が作成されます。
php artisan make:model CountryInfo[=モデル名]
作成されたモデルクラスに以下のプロパティを追加し、参照するビューを指定してください。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class CountryInfo extends Model
{
/**
*
* モデルと関連するビューを指定する
*/
protected $table = 'v_countryinformation';
}
備考:テーブル名とモデル名の規則性
モデルに対してどのテーブルを使用するかを$tableで指定しなければ、自動的にクラス名の複数形のテーブルを参照します。 例えば、Personモデルが参照するテーブルはPersonの複数系であるPeopleテーブルとなります。Eloquentを使ってビューのレコードを取得
今回はtinkerで取得出来ているかの確認をするので、下記のコマンドからtinkerを起動します。
php artisan tinker
起動できたらEloquentを使用してレコードを取得します。
App\CountryInfo::where('Language', 'English')->first();
=> App\CountryInfo {#3351
Code: "ABW",
CountryName: "Aruba",
CountryPopulation: 103000,
Code2: "AW",
Capital: 129,
CityName: "Oranjestad",
CityPopulation: 29034,
Language: "English",
IsOfficial: "F",
Continent: "North America",
Region: "Caribbean",
}
上手く取得出来たようですね。
上記の結果は次のクエリの結果と同等です。
SELECT * FROM v_countryinformation WHERE Language = 'English' LIMIT 1
また、当然ですがクエリビルダを使っても取得出来ます。
DB::table('v_countryinformation')->where('Language', 'English')->first();
=> {#3366
+"Code": "ABW",
+"CountryName": "Aruba",
+"CountryPopulation": 103000,
+"Code2": "AW",
+"Capital": 129,
+"CityName": "Oranjestad",
+"CityPopulation": 29034,
+"Language": "English",
+"IsOfficial": "F",
+"Continent": "North America",
+"Region": "Caribbean",
}
まとめ
ダラダラと書きましたが、要するにモデルクラスの$tableプロパティにビューを指定すれば良いということです。
クエリビルダにはテーブルを結合するjoinメソッドもあるので、わざわざビューを作る必要も無い気がしますが、個人的にはプログラム内でテーブル結合させるよりはビュー内でそれを行い、そのビューに対してフィルターをかけた方が少ないコードの量でデータを取得できるので良いなと思いました。
参考