もくじ
モデル
モデルとは
データベースとコントローラーを結ぶ役割を担うのがLaravelにおけるモデルです。
データベースやテーブル自体に関する設定はモデルに記述します。
基本的に一つのデータベーステーブルに対して一つのモデルを持ちます。
モデル作成
$ php artisan make:model Flight
モデル作成時にマイグレーションも生成したければ、--migration
もしくは-m
オプションが使えます。
$ php artisan make:model Flight --migration $ php artisan make:model Flight -m
テーブルの指定
指定しなくても問題ありません。
指定しない場合はクラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。
class Flight extends Model { /** * モデルと関連しているテーブル * * @var string */ protected $table = 'my_flights'; }
主キー(プライマリキー)
主キー変更
protectedのprimaryKeyプロパティを定義すれば、主キーを独自に設定できます。
デフォルト状態ではLaravelのEloquentはid
というカラム名がそのテーブルの主キーになると想定しています。そのid
を無効にして、明示的に指定します。
class Flight extends Model { /** * テーブルの主キー * * @var string */ protected $primaryKey = 'flight_id'; }
自動増分ではない主キー
さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。
自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティを用意し、falseをセットします。
class Flight extends Model { /** * IDが自動増分されるか * * @var bool */ public $incrementing = false; }
整数でない主キー
{ /** * 自動増分IDの「タイプ」 * * @var string */ protected $keyType = 'string'; }
全部必要なの?
UUID(一意なID)を主キーにしたい場合、$incrementing
と$keyType
の両プロパティを設定した方が良さそうです。
実験された方の記事に、無駄な処理が実行されている云々と書かれていました。
参考URL;Laravel の主キーで UUID を利用する時にハマった事、調べた事 - 沖縄で IT エンジニアやってます!
複数代入
$fillable
でフィールドへの代入を許可します。
create()やfill()、update()の際、値の代入を許可するフィールドを設定します。つまりそれ以外は代入が拒否されます。
class User extends Model { /** * 複数代入する属性 * * @var array */ protected $fillable = [ 'name', 'sex' ]; }
このようにかくと、nameとsexのみ書き換えられます。基本的にテーブルにあるカラムは全部入れるといいでしょう。
Eloquentを使ってモデル記述
まず、以下のモデルがapp/Modelsディレクトリにある想定です。
use Illuminate\Database\Eloquent\Model; class Flight extends Model { // }
モデルを使用するために、使用するファイルごとにuseで宣言しておきます。
use App\Models\Flight;
allメソッド(全件取得)
モデル名::all()
コントローラーなどで全件取得して、blade側でforeachでまわせば全件取得できます。
$flights = Flight::all(); return view('/index',[ 'flights' => $flights, ]);
foreach ($flights as $flight) { echo $flight->name; }
findメソッド(主キーで指定したレコードを取得)
モデル名::find(主キー)
主キー(id)で指定したレコードを取得できます。
複数のレコードを取得することも出来ます。その場合、戻り値はコレクションになります。
Flight::find(1); // 主キーが 1 のレコードを取得 Flight::find([1, 2, 3]); // 主キーが 1と2と3 のレコードを取得
whereメソッド(条件にマッチしたレコードを抽出)
Flight::where(条件)
条件を付けたい場合はwhereメソッドを使います。whereメソッドで抽出したレコードをgetメソッドで取得します。
Flight::where('active', 1)->get();
getメソッド(結果を取得)
Flight::where('active', 1)->get();
allメソッドやfindメソッドなどは結果を取得できますが、制約を付け加えたとき結果を取得するためにgetメソッドを使用します。
firstメソッド(最初のレコードを取得)
Flight::where('number', 'FR 900')->first();
countメソッド(レコードの集計)
->count()
sum
max
min
など、その他の集計メソッドも使用することもできます。
Flight::where('active', 1)->count(); Flight::where('active', 1)->max('price');
destroyメソッド(主キー指定でレコード削除)
主キーがわかっている場合に、主キーを指定して削除ができます。
App\Flight::destroy(1); App\Flight::destroy(1, 2, 3); App\Flight::destroy([1, 2, 3]); App\Flight::destroy(collect([1, 2, 3]));
deleteメソッド(条件指定でレコード削除)
->delete()
削除したい制約をつけて呼び出します。
Flight::find(1)->delete();
saveメソッド(レコードの追加)
モデルから新しいレコードを作成するには新しいインスタンスを作成し、saveメソッドを呼び出します。
public function store(Request $request) { $flight = new Flight; $flight->name = $request->name; $flight->save(); }
Request
とはLaravelの機能で、GETやPOSTリクエストなどで受け取ったパラメータを含んだデータです。
この場合、nameパラメーターをApp\Flightモデルインスタンスのname属性に代入しsave()
メソッドで保存しています。
saveが呼び出された時にcreated_atとupdated_atのタイムスタンプは自動的に設定されるので、ここでわざわざ設定する必要はありません。
ソフトデリート(論理削除)
物理削除ではなく、論理削除をします。
ソフトデリートするための準備をします。
namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Flight extends Model { use SoftDeletes; }
論理削除になるので削除される日時を指定するため、DBのテーブルにdeleted_atカラムを追加する必要があります。
Schema::table('flights', function (Blueprint $table) { $table->softDeletes(); });
これで、deleteメソッドを使用すれば、deleted_atカラムに現在時刻が挿入されます。モデル取得時も、deleted_atがNULLでなければ、クエリ結果に含まれなせん。
また、ソフトデリートされたモデルに対しクエリがあっても、削除済みのモデルはクエリ結果に含まれません。検索に含めるためにはtrashed
メソッドを使います。
さらに詳しく記事にしました。
まだまだ
Eloquentのおかげで本当に簡単にかけていいですね。
他にもメソッドがあるので、都度調べて使えるようになりたいです。