3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データベースで作成したビューをLaravelに取り込む

Last updated at Posted at 2021-08-08

はじめに

MySQLで作成したビューをLaravelに取り込む方法についてメモ感覚で。

  1. MySQLで作成したビューのモデルを作成する。
  2. 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」というビューを作成しました。
ちなみにレコードはこんな感じです。
v_countryinformation.png

ビューの作成が終わったら、モデル作成を行うコマンドを実行します。
下記のコマンド実行後、Appディレクトリに「モデル名.php」というファイル(今回はCountryInfo.php)が作成されます。

php artisan make:model CountryInfo[=モデル名]

作成されたモデルクラスに以下のプロパティを追加し、参照するビューを指定してください。
CountryInfo.php
<?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メソッドもあるので、わざわざビューを作る必要も無い気がしますが、個人的にはプログラム内でテーブル結合させるよりはビュー内でそれを行い、そのビューに対してフィルターをかけた方が少ないコードの量でデータを取得できるので良いなと思いました。

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?