Laravel は PHP のフレームワークでよく web アプリケーションを作るために用いられます。Laravel には RDB(Relational Database) と PHP クラスを紐づける ORM(Object-relational mapping)機能を持つクラスである Eloqeunt があります。
Eloquent:利用の開始 6.x Laravel
データベース中の値を検索する際に検索対象に集計結果を入れたい時があります。これはシステムについて必要なデータが完全にデータベース内にそろっており(例えば在庫の変化の履歴が必要なのに現在の在庫数しか持っていないデータベースが必要なデータの揃っていないデータベースです)、データの正規化が正しく行われている場合よくあります。そして検索機能は複雑な SQL が必要になりやすく、その実行速度も遅くなりやすいです。この実行速度の改善のために集計結果を持つテーブルが欲しくなる時があります。
この集計結果テーブルの実装方法は RDB のビュー機能であったり、トリガーによる自動更新であったり、プログラム上における自動更新であったり、色々です。そしては実装方法がどうであれ、任意の値をプログラム上から書き込めない方が安全なパターンが多いです。任意の値の書き込みを許すと集計結果の破壊や不整合なデータの書き込みが行われやすくなります。
Eloquent を経由した値の書き込みを困難にするコード例は次です。
class ExampleReadOnlyTable extends Eloquent { protected static function boot() { parent::boot(); $throwFn = static function () { throw new \LogicException(static::class.'は読み込み専用テーブルの Eloquent です'); }; self::creating($throwFn); self::updating($throwFn); self::saving($throwFn); self::deleting($throwFn); self::restoring($throwFn); } }
データの変更時イベントに例外を投げるようにします。これで Eloquent のメソッド経由で読み込み専用テーブルに値を書き込むクエリを発行することは困難になり、読み込みのみで使われる様になります。ちなみにもっと突き詰めるとそもそも Eloquent クラスとして作らない選択肢があります。検索でのみ参照するテーブルであるならば、検索クエリ構築クラスのみ用意しておき、その中の from 句の文字列に置いておくのみでいいというパターンです。