ORMはLaravelに含まれている、美しくシンプルなアクティブレコードによるデーター操作の実装です。それぞれのデータベーステーブルは関連する「モデル」と結びついています。モデルによりテーブル中のデータをクエリできますし、さらに新しいレコードを追加することもできます。使用開始前にconfig/database.phpを確実に設定してください。データベースの詳細はドキュメントで確認してください。利用を開始するには、まずEloquentモデルを作成しましょう。通常モデルはappディレクトリ下に置きますが、composer.jsonファイルでオートロードするように指定した場所であれば、どこでも自由に設置できます。全てのEloquentモデルは、Illuminate\Database\Eloquent\Modelを拡張する必要があります。Artisanコマンドを使用することです。Flightモデル作成時にデータベースマイグレーションも生成したければ、--migrationか-mオプションを使ってください。-mEloquentモデル規約ではflightsデータベーステーブルに情報を保存し、取得するために使用するFlightモデルクラスを例として見てください。//}テーブル名Flightモデルにどのテーブルを使用するか、Eloquentに指定していない点に注目してください。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。'my_flights';}主キーEloquentは更にテーブルの主キーがidというカラム名であると想定しています。この規約をオーバーライドする場合は、protectedのprimaryKeyプロパティを定義してください。'flight_id';}さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。デフォルト状態で主キーは自動的にintへキャストされます。自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティを用意し、falseをセットしてください。false;}主キーが整数でない場合は、モデルのprotectedの$keyTypeプロパティへstring値を設定してください。'string';}タイムスタンプデフォルトでEloquentはデータベース上に存在するcreated_at(作成時間)とupdated_at(更新時間)カラムを自動的に更新します。これらのカラムの自動更新をEloquentにしてほしくない場合は、モデルの$timestampsプロパティをfalseに設定してください。false;}タイムスタンプのフォーマットをカスタマイズする必要があるなら、モデルの$dateFormatプロパティを設定してください。このプロパティはデータベースに保存される日付属性のフォーマットを決めるために使用されると同時に、配列やJSONへシリアライズする時にも使われます。'U';}タイムスタンプを保存するカラム名をカスタマイズする必要がある場合、モデルにCREATED_ATとUPDATED_AT定数を設定してください。'last_update';}データベース接続Eloquentモデルはデフォルトとして、アプリケーションに設定されているデフォルトのデータベース接続を使用します。モデルで異なった接続を指定したい場合は、$connectionプロパティを使用します。'connection-name';}デフォルト属性値あるモデルの属性にデフォルト値を指定したい場合は、そのモデルに$attributesプロパティを定義してください。];}モデルの取得モデルと対応するデータベーステーブルを作成したら、データベースからデータを取得できるようになりました。各Eloquentモデルは、対応するデータベーステーブルへすらすらとクエリできるようにしてくれるクエリビルダだと考えてください。$flight->name;}制約の追加Eloquentのallメソッドはモデルテーブルの全レコードを結果として返します。Eloquentモデルはクエリビルダとしても動作しますのでクエリに制約を付け加えることもでき、結果を取得するにはgetメソッドを使用します。Eloquentモデルはクエリビルダですから、クエリビルダで使用できる全メソッドを確認しておくべきでしょう。Eloquentクエリでどんなメソッドも使用できます。モデルのリフレッシュfreshとrefreshメソッドを使用し、モデルをリフレッシュできます。freshメソッドはデータベースからモデルを再取得します。既存のモデルインスタンスは影響を受けません。$flight->fresh();refreshメソッドは、データベースから取得したばかりのデータを使用し、既存のモデルを再構築します。900"コレクション複数の結果を取得するallやgetのようなEloquentメソッドは、Illuminate\Database\Eloquent\Collectionインスタンスを返します。CollectionクラスはEloquent結果を操作する多くの便利なクラスを提供しています。$flight->cancelled;});このコレクションは配列のようにループさせることもできます。数千のEloquentレコードを処理する必要がある場合はchunkコマンドを利用してください。chunkメソッドはEloquentモデルの「塊(chunk)」を取得し、引数の「クロージャ」に渡します。chunkメソッドを使えば大きな結果を操作するときのメモリを節約できます。}});最初の引数には「チャンク(塊)」ごとにいくつのレコードを処理するかを渡します。2番めの引数にはクロージャを渡し、そのデータベースからの結果をチャンクごとに処理するコードを記述します。クロージャへ渡されるチャンクを取得するたびに、データベースクエリは実行されます。カーソルの使用cursorメソッドにより、ひとつだけクエリを実行するカーソルを使用し、データベース全体を繰り返し処理できます。大量のデータを処理する場合、cursorメソッドを使用すると、大幅にメモリ使用量を減らせるでしょう。指定したテーブルの全レコードを取得することに加え、findとfirstを使い1レコードだけを取得できます。モデルのコレクションの代わりに、これらのメソッドは1モデルインスタンスを返します。1)->first();また、主キーの配列をfindメソッドに渡し、呼び出すこともできます。一致したレコードのコレクションが返されます。Found例外モデルが見つからない時に、例外を投げたい場合もあります。これは特にルートやコントローラの中で便利です。findOrFailメソッドとクエリの最初の結果を取得するfirstOrFailメソッドは、該当するレコードが見つからない場合にIlluminate\Database\Eloquent\ModelNotFoundException例外を投げます。100)->firstOrFail();この例外がキャッチされないと自動的に404HTTPレスポンスがユーザーに送り返されます。これらのメソッドを使用すればわざわざ明確に404レスポンスを返すコードを書く必要はありません。App\Flight::findOrFail($id);});集計の取得もちろんクエリビルダが提供しているcount、sum、maxや、その他の集計関数を使用することもできます。これらのメソッドは完全なモデルインスタンスではなく、最適なスカラー値を返します。1)->max('price');モデルの追加と更新Insertsモデルから新しいレコードを作成するには新しいインスタンスを作成し、saveメソッドを呼び出します。}}この例では、受信したHTTPリクエストのnameパラメーターをApp\Flightモデルインスタンスのname属性に代入しています。saveメソッドが呼ばれると新しいレコードがデータベースに挿入されます。saveが呼び出された時にcreated_atとupdated_atタイムスタンプは自動的に設定されますので、わざわざ設定する必要はありません。Updatessaveメソッドはデータベースで既に存在するモデルを更新するためにも使用されます。モデルを更新するにはまず取得する必要があり、更新したい属性をセットしてそれからsaveメソッドを呼び出します。この場合もupdated_atタイムスタンプは自動的に更新されますので、値を指定する手間はかかりません。指定したクエリに一致する複数のモデルに対し更新することもできます。Diegoの全フライトに遅延(delayed)のマークを付けています。1]);updateメソッドは更新したいカラムと値の配列を受け取ります。Eloquentの複数モデル更新を行う場合、更新モデルに対するsaving、saved、updating、updatedモデルイベントは発行されません。その理由は複数モデル更新を行う時、実際にモデルが取得されるわけではないからです。一行だけで新しいモデルを保存するには、createメソッドが利用できます。挿入されたモデルインスタンスが、メソッドから返されます。これを利用する前に、Eloquentモデルはデフォルトで複数代入から保護されているため、モデルへfillableかguarded属性のどちらかを設定する必要があります。複数代入の脆弱性はリクエストを通じて予期しないHTTPパラメーターが送られた時に起き、そのパラメーターはデータベースのカラムを予期しないように変更してしまうでしょう。悪意のあるユーザーがHTTPパラメーターでis_adminパラメーターを送り、それがモデルのcreateメソッドに対して渡されると、そのユーザーは自分自身を管理者(administrator)に昇格できるのです。最初に複数代入したいモデルの属性を指定してください。モデルの$fillableプロパティで指定できます。Flightモデルの複数代入でname属性のみ使いたい場合です。['name'];}複数代入する属性を指定したら、新しいレコードをデータベースに挿入するためにcreateが利用できます。createメソッドは保存したモデルインスタンスを返します。10']);既に存在するモデルインスタンスへ属性を指定したい場合は、fillメソッドを使い、配列で指定してください。22']);属性の保護$fillableが複数代入時における属性の「ホワイトリスト」として動作する一方、$guardedの使用を選ぶことができます。$guardedプロパティは複数代入したくない属性の配列です。配列に含まれない他の属性は全部複数代入可能です。そのため$guardedは「ブラックリスト」として働きます。重要なのは、$fillableか$guardedのどちらか一方を使用することです。両方一度には使えません。以下の例は、priceを除いた全属性に複数代入できます。['price'];}全属性を複数代入可能にする場合は、$guardedプロパティに空の配列を定義します。firstOrNew他にも属性の複数代入可能な生成メソッドが2つあります。firstOrCreateとfirstOrNewです。firstOrCreateメソッドは指定されたカラム/値ペアでデータベースレコードを見つけようします。モデルがデータベースで見つからない場合は、最初の引数が表す属性、任意の第2引数があればそれが表す属性も同時に含む、レコードが挿入されます。firstOrNewメソッドもfirstOrCreateのように指定された属性にマッチするデータベースのレコードを見つけようとします。モデルが見つからない場合、新しいモデルインスタンスが返されます。firstOrNewが返すモデルはデータベースに保存されていないことに注目です。保存するにはsaveメソッドを呼び出す必要があります。'11:30']);updateOrCreateまた、既存のモデルを更新するか、存在しない場合は新しいモデルを作成したい状況も存在します。これを一度に行うために、LaravelではupdateOrCreateメソッドを提供しています。firstOrCreateメソッドと同様に、updateOrCreateもモデルを保存するため、save()を呼び出す必要はありません。Diego行きの飛行機があれば、料金へ99ドルを設定する。一致するモデルがなければ、作成する。1]);モデル削除モデルを削除するには、モデルに対しdeleteメソッドを呼び出します。上記の例ではdeleteメソッドを呼び出す前に、データベースからモデルを取得しています。モデルの主キーが分かっている場合は、モデルを取得せずにdestroyメソッドで削除できます。引数に主キーを一つ指定できるだけでなく、destroyメソッドは主キーの配列や、主キーのコレクションを引数に指定することで、複数のキーを指定できます。一連のモデルに対する削除文を実行することもできます。次の例はactiveではない印を付けられたフライトを削除しています。複数モデル更新と同様に、複数削除は削除されるモデルに対するモデルイベントを発行しません。複数削除文をEloquentにより実行する時、削除対象モデルに対するdeletingとdeletedモデルイベントは発行されません。削除文の実行時に、実際にそのモデルが取得されるわけではないためです。ソフトデリート本当にデータベースからレコードを削除する方法に加え、Eloquentはモデルの「ソフトデリート」も行えます。モデルがソフトデリートされても実際にはデータベースのレコードから削除されません。代わりにそのモデルにdeleted_at属性がセットされ、データベースへ書き戻されます。モデルのdeleted_atの値がNULLでない場合、ソフトデリートされています。モデルのソフトデリートを有効にするには、モデルにIlluminate\Database\Eloquent\SoftDeletesトレイトを使います。SoftDeletesトレイトは自動的にdeleted_at属性をDateTime/Carbonインスタンスへ変換します。データベーステーブルにもdeleted_atカラムを追加する必要があります。Laravelスキーマビルダにはこのカラムを作成するメソッドが存在しています。$table->softDeletes();});これでモデルに対しdeleteメソッドを使用すれば、deleted_atカラムに現在の時間がセットされます。ソフトデリートされたモデルに対しクエリがあっても、削除済みのモデルはクエリ結果に含まれません。指定されたモデルインスタンスがソフトデリートされているかを確認するには、trashedメソッドを使います。//}ソフトデリート済みモデルのクエリソフトデリート済みモデルも含める前述のようにソフトデリートされたモデルは自動的にクエリの結果から除外されます。結果にソフトデリート済みのモデルを含めるように強制したい場合は、クエリにwithTrashedメソッドを使ってください。->get();withTrashedメソッドはリレーションのクエリにも使えます。$flight->history()->withTrashed()->get();ソフトデリート済みモデルのみの取得onlyTrashedメソッドによりソフトデリート済みのモデルのみを取得できます。時にはソフトデリート済みのモデルを「未削除」に戻したい場合も起きます。ソフトデリート済みモデルを有効な状態に戻すには、そのモデルインスタンスに対しrestoreメソッドを使ってください。$flight->restore();複数のモデルを手っ取り早く未削除に戻すため、クエリにrestoreメソッドを使うこともできます。他の「複数モデル」操作と同様に、この場合も復元されるモデルに対するモデルイベントは、発行されません。->restore();withTrashedメソッドと同様、restoreメソッドはリレーションに対しても使用できます。$flight->history()->restore();モデルの完全削除データベースからモデルを本当に削除する場合もあるでしょう。データベースからソフトデリート済みモデルを永久に削除するにはforceDeleteメソッドを使います。関係するモデルを全部完全に削除する$flight->history()->forceDelete();クエリスコープグローバルスコープグローバルスコープにより、指定したモデルの全クエリに対して、制約を付け加えることができます。Laravel自身のソフトデリート機能は、「削除されていない」モデルをデータベースから取得するためにグローバルスコープを使用しています。独自のグローバルスコープを書くことにより、特定のモデルのクエリに制約を確実に、簡単に、便利に指定できます。グローバルスコープの記述グローバルスコープは簡単に書けます。Illuminate\Database\Eloquent\Scopeインターフェイスを実装したクラスを定義します。このインターフェイスは、applyメソッドだけを実装するように要求しています。applyメソッドは必要に応じ、where制約を追加します。クエリのSELECT節にカラムを追加するグローバルスコープの場合は、selectの代わりにaddSelectメソッドを使用してください。これにより、クエリの存在するSELECT節を意図せずに置き換えてしまうのを防げます。グローバルスコープの適用モデルにグローバルスコープを適用するには、そのモデルのbootメソッドをオーバライドし、addGlobalScopeメソッドを呼び出します。}}スコープを追加した後から、User::all()は以下のクエリを生成するようになります。200クロージャによるグローバルスコープEloquentではクロージャを使ったグローバルスコープも定義できます。独立したクラスを使うだけの理由がない、簡単なスコープを使いたい場合、特に便利です。特定のクエリからグローバルスコープを削除した場合は、withoutGlobalScopeメソッドを使います。唯一の引数として、クラス名を受けます。User::withoutGlobalScope(AgeScope::class)->get();もしくは、クロージャを使用し、グローバルスコープを定義している場合は:User::withoutGlobalScope('age')->get();複数、もしくは全部のグローバルスコープを削除したい場合も、withoutGlobalScopesメソッドが使えます。SecondScope::class])->get();ローカルスコープローカルスコープによりアプリケーション全体で簡単に再利用可能な、一連の共通制約を定義できます。人気のある(popular)ユーザーを全員取得する必要が、しばしばあるとしましょう。スコープを定義するには、scopeを先頭につけた、Eloquentモデルのメソッドを定義します。スコープはいつもクエリビルダインスタンスを返します。}}ローカルスコープの利用スコープが定義できたらモデルのクエリ時にスコープメソッドを呼び出せます。メソッドを呼び出すときはscopeプレフィックスをつけないでください。様々なスコープをチェーンでつなぎ呼び出すこともできます。App\User::popular()->active()->orderBy('created_at')->get();orクエリ操作により、複数のEloquentモデルスコープを組み合わせるには、クロージャのコールバックを使用する必要があります。orWhereメソッドを用意しています。App\User::popular()->orWhere->active()->get();動的スコープ引数を受け取るスコープを定義したい場合もあるでしょう。スコープにパラメーターを付けるだけです。スコープパラメーターは$query引数の後に定義しする必要があります。}}これでスコープを呼び出すときにパラメーターを渡せます。時に2つのモデルが「同じ」であるかを判定する必要が起きるでしょう。isメソッドは2つのモデルが、同じ主キー、テーブル、データベース接続を持っているかを確認します。//}イベントEloquentモデルは多くのイベントを発行します。creating、created、updating、updated、saving、saved、deleting、deleted、restoring、restored、retrievedのメソッドを利用し、モデルのライフサイクルの様々な時点をフックすることができます。イベントにより特定のモデルクラスが保存されたりアップデートされたりするたび、簡単にコードを実行できるようになります。各イベントは、コンストラクタによりモデルのインスタンスを受け取ります。retrievedは、データベースから既存のモデルを取得した時に発行されます。新しいアイテムが最初に保存される場合にcreatingとcreatedイベントが発行されます。既存のアイテムにsaveメソッドが呼び出されるとupdatingとupdatedイベントが発行されます。どちらの場合にもsavingとsavedイベントは発行されます。Eloquentの複数モデル更新を行う場合、更新モデルに対するsavedとupdatedモデルイベントは発行されません。その理由は複数モデル更新を行う時、実際にモデルが取得されるわけではないからです。使用するには、Eloquentモデルに$dispatchesEventsプロパティを定義します。これにより、Eloquentモデルのライフサイクルの様々な時点を皆さん自身のイベントクラスへマップします。];}Eloquentイベントの定義とマップができたら、イベントリスナを使用し、イベントを処理できます。特定のモデルに対し、多くのイベントをリスニングしている場合、全リスナのグループに対するオブザーバを一つのクラスの中で使用できます。オブザーバクラスは、リッスンしたいEloquentイベントに対応する名前のメソッドを持ちます。これらのメソッドは、唯一の引数としてモデルを受け取ります。Artisanコマンドで、新しいオブザーバクラスを簡単に生成できます。--model=Userこのコマンドは、App/Observersディレクトリへ新しいオブザーバを設置します。このディレクトリが存在しなければ、Artisanが作成します。真新しいオブザーバは、次の通りです。}}オブザーバを登録するには、監視したいモデルに対し、observeメソッドを使用します。サービスプロバイダの一つの、bootメソッドで登録します。以下の例では、AppServiceProviderでオブザーバを登録しています。2019.ドキュメントメンテナンス期間は終了しました。注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。閉じる移動クリックで即時移動します。適用ボタンクリック後に、全項目まとめて適用されます。Scaffoldスカフォールド型枠生成スカフィールドLargeスクリーン表示幅640px80%90%100%インデントなし1rem2rem3rem本文フォントコードフォントフォント適用確認フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。バックスラッシュを含むインライン\Code\Blockの例です。以下はコードブロックの例です。}}設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。