Laravel
Laravel6でSQLファイルからEloquent Modelを作成
ヤス
更新日:2021/08/04
はじめに
システム開発をしていると、Viewにするほどではない複雑なSQLを利用する機会があります。
個人的にはSQL文やJOIN等の処理をプログラムソース上に記述したくないので、SQLファイルを作成してファイルを読み込むようにしています。
(個人的にはSQLの可読性や保守性が向上します)
また、普段データの取得にはEloquent Modelを利用しているので、作成したSQLファイルもEloquent Modelにしたかったので自作してみました。
ViewっぽいEloquent Modelを作成
ViewっぽいModelだと思っているので、名前はviewにしています。
Modelを保存しているディレクトリ(App\Models)にsqldataというディレクトリを作成し、そこにSQLファイルを配置することで利用できます。
仕組みとしては、BuilderのfromSubを利用して、Eloquent ModelのFromにSQLファイルを設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; class view extends Model { public static $sqlname = null; protected static function boot() { parent::boot(); //SQLファイルをFROMのサブクエリとして設定 static::addGlobalScope('default', function (Builder $builder){ $builder->fromSub(self::getSqlData(self::$sqlname), 'view_'.self::$sqlname); }); } /** * SQLデータ取得 */ private static function getSqlData($sqlname) { if(is_null($sqlname)){ throw new \RuntimeException('viewモデルは引数無では動作しません。'); } $filename = __DIR__ . "/sqldata/$sqlname.sql"; if (!file_exists($filename)) { return null; } $sqldata = file_get_contents($filename); $sqldata = str_replace("\r\n", " ", $sqldata); $sqldata = preg_replace('/\s+/', ' ', $sqldata); return $sqldata; } } |
利用方法
viewを利用する時は、$sqlnameを事前に設定することで通常のEloquent Modelを同様に利用できます。
1 2 3 4 |
//SQLファイル名の設定 App\Models\view::$sqlname = 'test'; //データの取得 App\Models\view::where('id',$id)->get(); |
参考サイト
下記のサイトを参考に作成しています。
生SQLからEloquent Modelを作る3つの方法